Jeux et hasard#
Un jeu aléatoire fournit un contexte concret pour écrire une simulation. Avant de programmer, il faut préciser les règles, ce qui est tiré au hasard et le résultat que l’on souhaite mesurer.
Dès la seconde
Une marche aléatoire#
Un mobile part de 0. À chaque étape, il avance de 1 ou recule de 1 avec la même probabilité. La liste doit contenir la position initiale, puis chaque nouvelle position.
Une trajectoire particulière ne décrit pas tout le modèle. Plusieurs marches seraient nécessaires pour estimer, par exemple, la probabilité de revenir en 0.
Mise en pratique
Écrire une fonction marche(n) qui renvoie les n+1 positions d’une marche de n
étapes, position initiale comprise.
Le problème de Monty Hall#
Une voiture est cachée derrière l’une de trois portes. Le joueur choisit une porte. Le présentateur, qui connaît la bonne réponse, ouvre ensuite une autre porte derrière laquelle il n’y a pas de voiture. Le joueur peut conserver son premier choix ou prendre l’unique autre porte encore fermée.
Deux règles sont essentielles : le présentateur sait où se trouve la voiture et il n’ouvre jamais la porte choisie. Son intervention n’est donc pas un simple tirage au hasard.
Au premier choix, deux situations seulement sont possibles :
Garder gagne ; changer perd.
Le présentateur élimine l’autre porte perdante : changer gagne.
La stratégie « garder » gagne donc lorsque le premier choix était correct. La stratégie « changer » gagne exactement dans le cas contraire. La simulation doit retrouver des fréquences proches de \(1/3\) et \(2/3\).
Le programme suivant détaille une seule partie. Les deux stratégies sont évaluées avec la même voiture, le même choix initial et la même porte ouverte.
L’instruction break interrompt immédiatement la boucle en cours. Ici, dès qu’une porte que
le présentateur peut ouvrir a été trouvée, il est inutile de poursuivre la recherche.
Pour comparer honnêtement les stratégies, il reste à répéter cette même partie et à compter les deux types de victoire. Les deux compteurs ne doivent jamais augmenter pendant la même partie.
Mise en pratique
Écrire une fonction monty_hall(N) qui renvoie les fréquences de victoire sur N parties,
d’abord en conservant la porte initiale, puis en changeant systématiquement.
Une stratégie de mise#
Dans la stratégie de d’Alembert utilisée ici, la mise commence à 1 €. Après une perte, elle augmente de 1 € ; après un gain, elle diminue de 1 € sans passer sous 1 €. Le capital augmente ou diminue de la mise engagée.
Pour éviter de perdre le fil dans un programme assez long, on peut le découper en quatre étapes :
initialiser le capital, la mise et la liste des capitaux ;
tirer pile ou face ;
modifier le capital puis la mise selon le résultat ;
ajouter le nouveau capital à la liste.
Mise en pratique
Écrire une fonction dalembert(n, capital_initial) qui renvoie la liste des capitaux, depuis
la valeur initiale jusqu’au dernier des n lancers. L’utiliser pour simuler 100 lancers à
partir de 20 €, puis observer la valeur finale, le minimum et le maximum de la liste. Recommencer
plusieurs fois et expliquer pourquoi quelques simulations ne prouvent pas que la stratégie est
gagnante ou perdante.
Représenter ensuite l’évolution
Le tracé sera étudié pas à pas dans la page « Données ». Après avoir écrit la fonction, ce bloc suffit déjà pour représenter une simulation sans modifier l’algorithme :
import matplotlib.pyplot as plt
capitaux = dalembert(100, 20)
plt.plot(range(len(capitaux)), capitaux)
plt.xlabel("Nombre de lancers")
plt.ylabel("Capital en euros")
plt.grid(True)
plt.show()
Pierre, feuille, ciseaux#
Pour programmer les règles sans oubli, on commence par traiter l’égalité, puis les trois couples gagnants du joueur. Tous les autres couples donnent la victoire à l’ordinateur.
La fonction random.choice(liste) choisit directement un élément d’une liste. Par exemple,
random.choice(["pierre", "feuille", "ciseaux"]) produit un choix aléatoire de l’ordinateur
après import random.
Mise en pratique
Écrire une fonction gagnant(joueur, ordinateur) qui renvoie "joueur", "ordinateur"
ou "egalite". Simuler ensuite un grand nombre de parties aléatoires et observer les trois
fréquences.
Le lièvre et la tortue#
On lance un dé. Si un 6 apparaît, le lièvre gagne immédiatement. Sinon, la tortue avance d’une case ; elle gagne dès qu’elle a avancé six fois.
Une partie utilise donc une boucle dont on ne connaît pas à l’avance le nombre de lancers. Elle s’arrête dès que l’une des deux conditions de victoire est réalisée. La case « départ » correspond à zéro avancée ; les nombres indiquent combien de résultats différents de 6 ont déjà fait progresser la tortue.
Mise en pratique
Écrire une fonction lievre_tortue(N) qui simule N parties et renvoie les deux fréquences
de victoire, dans l’ordre : lièvre puis tortue.
Dans le parcours