1ere - Algo - TD2

Boucles imbriquées

Les algorithmes que nous avons vus jusqu'ici utilisent pour la plupart une boucle for.

Dans les exercices ci-dessous, nous allons utiliser des boucles imbriquées : des boucles dans des boucles.

Algorithme de mélange Knuth
Il est souvent nécessaire de mélanger les éléments d'une liste aléatoirement, c'est par exemple le cas si vous simulez un jeu de cartes, et que vous voulez distribuer les cartes. Il existe de nombreux algorithmes pour cela, nous allons étudier l'algorithme de mélange de Knuth.
  • on parcours le tableau de gauche à droite
  • Pour chaque élément d'indice i, on le permute avec l'élément d'indice j avec j aléatoire entre 0 et i
Ecrire une fonction melangeKnuth(l) qui réalise la permutation aléatoire d'un tableau l avec l'algorithme de Knuth. La fonction renvoie la liste ainsi mélangée.
Exercice de code : Méli-Mélo de Knuth
Ecrire la fonction melangeKnuth(lst). Une liste lst sera générée pour tester votre code.
Allumer Eteindre

Vous devez écrire un code qui représente la situation, et qui affiche a liste des lampes allumées après la 100ème étape.
L'état d'une lampe sera représenté par True (allumé) ou False (éteint).
Commencez par créer un tableau de 100 booléen tous égaux à True, c'est l'état après l'étape 1.
Ensuite vous devez effectuer les étape 2 à 100 (inclues). Durant chaque étape, vous devez changer l'état des lampes qui conviennent. Par exemple à l'étape 2, toutes les lampes paires, etc...
Enfin, un dernier parcours de la liste des lampes sera fait pour afficher les n° des lampes allumées
Exercice de code : Allumée ?
Les lampes étiente peuvent être allumées à l'étape suivante. A chaque étape on manipule les interupteurs, donc on rallume des lampes éteintes ou éteint des lampes allumées....

Série d'exercice portant sur l'utilisation du Tant que

L'usage des boucles while peut poser d'autres problèmes que ceux vus précédemment. Voyons cela sur des exemples :

Le lièvre et la tortue (partie 1)

Dans cet exercice vous allez programmer une simulation d'une course entre le lièvre et la tortue.

Les règles du jeu :

On jette un dé à 6 faces. Si on obtient 6, le lièvre à gagné, sinon, la tortue avance d'une case. La tortue gagne si elle atteint la 4ème case, les deux partent de la case 0.

Vous devez écrire la fonction game() qui renvoie "Lievre" ou "Tortue".

Exercice de code : Le lièvre et la tortue
Ecrire une function game() qui simule une course avec les règles ci-dessus et renvoie le vainqueur : "Lievre" ou "Tortue". Lors de l'exécution le solver va générer une variable x utile pour gérer le comportement de random, n'en tenez aucun compte.
Le lièvre et la tortue (partie 2)

Dans cette seconde partie, on admet que vous disposez de la fonction game() de l'exercice précédent. Vous allez l'utiliser pour déterminer qui, du Lièvre et de la Tortue, a les meilleures chances de gagner la course.

Pour le savoir, écrire un code qui appelle 1000 fois la fonction game() et qui affiche le pourcentage de victoires de la Tortue, arrondi à 0.1 près (utiliser round() ).

Exercice de code : Le lièvre et la tortue (partie 2)
Ecrire un programme qui appelle 1000 fois la fonction game() de la partie 1, et compte le nombre de victoires de la Tortue. Votre code doit afficher le pourcentage de victoire de la Tortue. Lors de l'exécution le solver va générer une variable x utile pour gérer le comportement de random, n'en tenez aucun compte.

Ce dernier code cache une boucle imbriquée dans le boucle. Combien de fois appelle t-on game() ? Si on admet qu'une partie se joue en moyenne en 4 lancés de dé, combien de fois les 1000 courses ont nécessité le lancé du dé ?

 
Le duc de Toscane

Il est naturellement possible d'expliquer le paradoxe du Duc de Toscane en calculant les probabilités d'obtenir 10 ou 9. Mais nous allons le faire d'une autre façon : en effectuant des simulations numériques.

La première chose à faire est de créer une fonction play() qui simule une partie.

Dans un second temps, nous écrirons un code qui appelle un grand nombre de fois cette fonction play() et compte le nombre de 10 et de 9 obtenus.

On arrêtera lorsque le nombre de 9 + nombre de 10 sera égal à 1000 comme si nous jouions un grand nombre de parties.

Exercice de code
Ecrire la fonction play : Entrée : Rien Sortie : La somme de trois dés (3 entiers aléatoires entre 1 et 6)

Maintenant vous devez écrire un code qui appelle play() tant que le nombre de résultats 9 ou 10 n'est pas 1000.

Exercice de code
Ecrire un code qui appelle la fonction play() (inutile de la réécrire elle est préprogrammée dans l'exercice).

Vous devez compter le nombre de fois ou on obtient 9 et le nombre de fois ou on obtient 10.
On continue de jouer tant que le nombre total de 9 et de 10 n'atteint pas 1000.
 
Vous utiliserez n9 et n10 comme compteurs.