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.

Exemple
Construire un trajet
Prêt
Sortie

  

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.

À toi
Marche aléatoire
À faire
Sortie

  

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 :

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.

Exemple
Dérouler une partie
Prêt
Sortie

  

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.

À toi
Deux stratégies
À faire
Sortie

  

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 :

  1. initialiser le capital, la mise et la liste des capitaux ;

  2. tirer pile ou face ;

  3. modifier le capital puis la mise selon le résultat ;

  4. 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.

À toi
Stratégie de d’Alembert
À faire
Sortie

  
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.

À toi
Pierre, feuille, ciseaux
À faire
Sortie

  

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.

À toi
Lièvre et tortue
À faire
Sortie

  

Dans le parcours