Probabilités: quand un tableur ne peut rien pour vous publié le 19/09/2022

Python pour simuler le jeux de "Monty Hall"

Fluctuations d’une fréquence selon les échantillons, probabilités

Capacités et connaissances

Capacités Connaissances
Expérimenter pour observer la fluctuation des fréquences (jets de dés, lancers de pièces de monnaie…). Vocabulaire des probabilités : expérience aléatoire, ensemble des issues (univers), événement, probabilité.
Estimer la probabilité d’un événement à partir des fréquences Stabilisation relative des fréquences
vers la probabilité de l’événement quand n augmente.

Let’s make a deal : le problème de Monty Hall

Let’s make a deal est un jeu de la télévision américaine des années 1970, présenté par Monty Hall. Il est évoqué dans le film Las vegas 21.


La règle du jeux est la suivante :

Le jeu oppose un présentateur à un candidat (le joueur). Ce joueur est placé devant trois portes fermées. Derrière l’une d’elles se trouve une voiture et derrière chacune des deux autres se trouve une chèvre. Il doit tout d’abord désigner une porte. Puis le présentateur doit ouvrir une porte qui n’est ni celle choisie par le candidat, ni celle cachant la voiture (le présentateur sait quelle est la bonne porte dès le début). Le candidat a alors le droit d’ouvrir la porte qu’il a choisie initialement, ou d’ouvrir la troisième porte. Quelle est la meilleure stratégie pour remporter la voiture ?1 :
  • Conserver son choix initial ?
  • Choisir l’autre porte restée fermée ?

Dans ce jeux la détermination de la probabilité de gagner si l’on change son choix n’est pas immédiate, voire contre intuitive. Un candidat qui change d’avis modifie-t-il ses chances de remporter la voiture ?

Dans la mesure ou cette probabilité n’est pas connue, la modélisation avec un tableur n’est pas si évidente à réaliser, mais cela reste possible. L’expressivité du langage Python permet de rester proche de la conception mathématique du problème avec des ensembles ou des listes sans connaître la probabilité de gain de chaque stratégie.

Activités

On propose :

  • Une activité déconnectée pour identifier la bonne stratégie de gain.
  • Un premier programme python simulant une unique partie. Jouer une vingtaine de parties, valide la stratégie.
  • Un deuxième programme permet, en le modifiant, d’augmenter le nombre de répétitions des parties pour voir la stabilisation de la fréquence de gain des deux stratégies se stabiliser. Cette stabilisation de la fréquence estime la probabilité de gain de chacune des stratégies.

On peut vérifier ainsi que la fréquence de gain d’un joueur qui ne changerait pas d’avis, tend vers P(gain)=1/3.

Activité déconnectée

Avant de joueur avec les simulation Python, il est sans doute préférable de commencer par une activité déconnectée. Un document papier est disponible pour les élèves :

montyhall-debranche (PDF de 139 ko)

.
En faisant quelques parties

Une première simulation en Python

Code Python simulant une unique partie du jeu des trois portes :

Pour s’approprier la simulation, on peut commencer par proposer d’analyser une sortie du programme :

import time
Le module time permettra d’afficher l’heure d’exécution du programme
import random
Sans ce module, pas de simulation aléatoire
PORTES_FERMEES = ["porte1", "porte2", "porte3"]
Ceci est la liste des trois portes.
PORTE_VOITURE = set([random.choice(PORTES_FERMEES)])
On a choisi aléatoirement la porte dissimulant la voiture.
CHOIX1_JOUEUR = set([random.choice(PORTES_FERMEES)])
Le joueur choisit la porte dissimulant la voiture. Comme le jeux n’est pas interactif, le choix est aléatoire.
PORTES_FERMEES = set(PORTES_FERMEES)
On convertit la liste des portes en ensemble des portes de manière à pouvoir utiliser les opération ensemblistes.
On place une chèvre derrière une porte où il n’y a pas de voiture, c’est l’ensemble des portes dissimulant une chèvre privé de l’ensemble des portes dissimulant une voiture (ici un seul élément, "la bonne porte")
PORTES_CHEVRES = PORTES_FERMEES - PORTE_VOITURE
Le présentateur sait où est la voiture. Il choisit donc une porte où se trouve une chèvre. On choisit aléatoirement un élément (porte) de l’ensemble des portes privée de voiture.
Malheureusement il faut ici retransformer l’ensemble "chevres" en liste pour faire un tirage aléatoire entre les deux portes.
Mont Hall doit choisir une porte qui ne cache pas de voiture et qui n’est pas celle du joueur. On réalise un tirage aléatoire dans cet ensemble avec un tour de passe-passe exploitant une liste :

CHOIX_PRESENTATEUR = random.choice(list(PORTES_CHEVRES - CHOIX1_JOUEUR))
CHOIX_PRESENTATEUR = set([CHOIX_PRESENTATEUR])
PORTES_FERMEES = PORTES_FERMEES - CHOIX_PRESENTATEUR

On simule un joueur qui ne change pas son choix :

print("Monthy Hall demande au joueur s'il veut changer son choix:")
print("      Non, le joueur ne change pas son choix, on ouvre la ", CHOIX1_JOUEUR)

Monty Hall ouvre une porte, Il y a deux issues :

  • La porte du joueur et celle de la voiture sont identique (les deux ensembles de portes sont égaux, ce qui en écriture ensembliste s’exprime par chaque ensemble étant sous ensemble de l’autre).
  • sinon le joueur perd.

Il faut donc introduire un test if ... else ...

if CHOIX1_JOUEUR.issubset(PORTE_VOITURE) and PORTE_VOITURE.issubset(CHOIX1_JOUEUR):
   print('          le joueur gagne la voiture')
else:
   print('          le joueur perd')

On simule maintenant un joueur qui change d’avis :

NOUVEAU_CHOIX = PORTES_FERMEES - CHOIX1_JOUEUR
print("      Oui: le joueur change son choix, on ouvre la ",NOUVEAU_CHOIX)

Si un ensemble E1 est ss ensemble de E2 et E2 ss ensemble de E1 alors E1=E2

if NOUVEAU_CHOIX.issubset(PORTE_VOITURE) and PORTE_VOITURE.issubset(NOUVEAU_CHOIX):
   print('          le joueur gagne la voiture')
else:
   print('          le joueur perd')an

L’ensemble du programme est disponible ci-dessous :

Simulation Python : observer la fluctuation de fréquence de gain

La répétition automatisée d’une partie du jeux des trois portes montre la diminution de la fluctuation de la fréquence des gains avec le nombre croissant de répétitions.
Cette deuxième partie de la simulation est disponible dans un notebook Basthon.

Une sortie du programme donne par exemple :

23 /06/2022 18:15:27
Un joueur joue 100 fois au jeu de Monthy Hall :
le joueur ne change pas son choix
le joueur gagne : 34 fois sur 100
le joueur change son choix
En changeant son choix, le joueur gagne : 68 fois sur 100

Il faut déterminer la variable du programme à modifier pour augmenter le nombre de parties. Dans cet exemple, il est normal que le total 34+68 soit différent de 100. Le programme teste séquentiellement les deux stratégies (ne pas changer de choix ou changer de choix).
Ce deuxième programme, n’utilise que des listes et pas d’ensemble (set) :

Documents

 notebook Basthon

Questions ouvertes

  • que se passe-t-il si on ajoute des portes ?
  • comment modifier le premier programme pour répéter des parties ?