Si vous êtes un enfant des années 70, vous avez peut-être grandi en regardant le célèbre jeu télévisé Let’s Make a Deal. Depuis lors, les gens discutent vivement du problème de Monty Hall et s’amusent à le reproduire. Le suspense et le drame époustouflants créés lorsque le concurrent choisit l’une des trois portes sont toujours amusants à regarder.
En utilisant les mathématiques et un peu de programmation, vous allez construire un simulateur de Monty Hall en utilisant Python. Grâce à lui, vous pourrez décider une fois pour toutes que le fait de changer de porte augmente vos chances de gagner.
Qu’est-ce que le problème de Monty Hall ?
Le problème de Monty Hall est un casse-tête nommé d’après l’animateur de jeux vidéo, Monty Hall. Il y a trois portes, dont une seule contient le prix désiré. Une fois que vous avez choisi une porte, Monty – qui sait ce qui se trouve derrière – ouvre une autre porte, révélant une chèvre. Vous avez alors la possibilité de conserver votre décision initiale ou de passer à l’autre porte.
En raison de sa nature surprenante et imprévisible, l’énigme de Monty Hall est très populaire. Bien qu’elle traite de probabilités, la solution défie l’intuition. Elle constitue une excellente démonstration de la confusion que peuvent susciter les calculs de probabilité. L’énigme nous apprend à ignorer les impressions d’événements apparemment aléatoires et à nous concentrer sur le raisonnement et les faits.
Les modules Random et Tkinter
Pour construire une simulation Monty Hall en Python, commencez par les modules Random et Tkinter.
Le module Random contient plusieurs fonctions permettant de produire des nombres aléatoires. Vous pouvez utiliser ces algorithmes pour générer des séquences mélangées, des mouvements de jeu et des nombres entiers pseudo-aléatoires. Il est fréquemment utilisé dans des jeux comme le cricket à la main, ou un simple test de dactylographie, ainsi que pour simuler des jets de dés et pour mélanger des listes.
Tkinter est la bibliothèque d’interface graphique par défaut de Python. Elle vous permet de créer de fantastiques applications d’interface graphique. Vous pouvez créer une application de liste de tâches, un éditeur de texte ou une simple calculatrice. Vous pouvez mettre vos connaissances en pratique et affiner vos compétences en programmation en utilisant Python et Tkinter pour construire des applications de bureau de base.
Ouvrez un terminal et exécutez la commande suivante pour ajouter Tkinter à votre système :
pip install tkinter
Comment construire un simulateur Monty Hall en utilisant Python
Vous pouvez trouver le code source du simulateur Monty Hall dans ce dépôt GitHub.
Importez les modules random et Tkinter. La fonction StringVar permet de contrôler plus facilement la valeur d’un widget comme une étiquette ou une entrée. Vous pouvez utiliser une étiquette pour afficher du texte à l’écran et une entrée pour récupérer les données de l’utilisateur.
Initialiser l’instance Tkinter et afficher la fenêtre racine. Définissez les dimensions de la fenêtre à 600 pixels de large et 200 pixels de haut en utilisant l’attribut geometry() méthode. Définissez un titre de fenêtre approprié et interdisez son redimensionnement.
import random
from tkinter import StringVar, Label, Tk, Entry
window = Tk()
window.geometry("600x200")
window.title("Monty Hall Simulation")
window.resizable(0, 0)
Ensuite, configurez deux paires de widgets et de variables pour stocker les résultats de la simulation. Votre application demandera un certain nombre d’exécutions. Pendant chaque exécution, elle simulera le jeu et enregistrera le résultat dans chaque cas : si le joueur décide de changer ou de garder le même choix.
En utilisant StringVar(), définissez les valeurs initiales du même choix et du choix changé à 0. Définissez un widget Entrée et définissez sa taille de police à 5. Déclarez deux étiquettes pour afficher le même choix et le choix modifié et positionnez-les. Déclarez deux autres étiquettes qui afficheront la valeur des variables que vous avez définies précédemment. Enfin, placez le widget Entry sous ces quatre étiquettes.
same_choice = StringVar()
switched_choice = StringVar()
same_choice.set(0)
switched_choice.set(0)
no_sample = Entry(font=5)
Label(text="Same Choice").place(x=230, y=58)
Label(text="Switched Choice").place(x=230, y=90)
Label(textvariable=same_choice, font=(50)).place(x=350, y=58)
Label(textvariable=switched_choice, font=(50)).place(x=350, y=90)
no_sample.place(x=200, y=120)
Définissez une fonction, simuler. Initialiser les variables de résultat et obtenir la valeur d’échantillon entrée par l’utilisateur. Déclarez une liste qui contient les éléments que les portes vont révéler.
Dans chaque exécution, faites une liste dupliquée des portes originales et mélangez-la dans un ordre aléatoire. Choisissez une porte au hasard et retirez-la – ceci simule le choix du joueur. Simulez ensuite la révélation de Monty : si la première porte ne contient pas le prix, ouvrez-la, sinon ouvrez la deuxième porte. Supprimez ce choix et laissez la porte restante comme option de passage.
def simulate(event):
same_choice_result = 0
switched_choice_result = 0
samples = int(no_sample.get())
doors = ["gold", "goat", "goat"]
for _ in range(samples):
simulated_doors = doors.copy()
random.shuffle(simulated_doors)
first_choice = random.choice(simulated_doors)
simulated_doors.remove(first_choice)
opened_door = simulated_doors[0] if simulated_doors[0] != "gold" else simulated_doors[1]
simulated_doors.remove(opened_door)
switched_second_choice = simulated_doors[0]
Si le premier choix contient le prix désiré, incrémentez le résultat du même choix de un et reflétez-le sur l’écran. Sinon, effectuez la même opération pour le choix changé.
if first_choice == "gold":
same_choice_result += 1
same_choice.set(same_choice_result)
elif switched_second_choice == "gold":
switched_choice_result += 1
switched_choice.set(switched_choice_result)
Une étape importante est de lier la touche Entrée avec un événement dans la fenêtre Tkinter. Ainsi, lorsque le joueur appuie sur la touche Enterune fonction particulière sera exécutée. Pour ce faire, passez la chaîne de caractères <Return> ; et la fonction simulate comme paramètres à la fonction bind() fonction.
Le site mainloop() indique à Python d’exécuter la boucle d’événements de Tkinter et d’écouter les événements (comme les pressions sur les boutons) jusqu’à ce que vous fermiez la fenêtre.
no_sample.bind("<Return>", simulate)
window.mainloop()
Assemblez le tout et exécutez votre programme pour simuler le puzzle en action.
Sortie du simulateur Monty Hall en utilisant Python
En exécutant le programme, vous verrez une fenêtre simple avec les étiquettes de choix « Same » et « Switched ». Entrez un numéro d’échantillon dans le champ en bas pour voir les résultats simulés. Dans cet échantillon de 3 exécutions, le programme montre qu’il gagne une fois avec le même choix et deux fois avec un changement.
Ces résultats sont aléatoires, mais vous pouvez exécuter la simulation avec un échantillon plus grand pour plus de précision. Dans l’échantillon suivant de 100, le choix commuté gagne 65 fois.
Résoudre des problèmes en utilisant la programmation
Le simulateur Monty Hall est une excellente démonstration de la façon dont vous pouvez utiliser la programmation pour résoudre des problèmes de la vie réelle. Vous pouvez développer divers algorithmes et former des modèles pour effectuer des tâches particulières comme le tri d’un tableau ou l’amélioration de l’efficacité d’un système pour une production optimale.
Les différents langages de programmation offrent différentes capacités et fonctions pour faciliter la programmation. En utilisant Python, vous pouvez créer des modèles capables de prédire les valeurs futures d’un ensemble de données avec une plus grande précision. En outre, vous pouvez automatiser les opérations répétitives, réduire le travail ennuyeux et améliorer la vitesse et la précision.