[PYTHON] Écrivons un programme de simulation simple pour le "problème de Monty Hall"

[Problème de Monty Hall](https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%BB% E3% 83% 9B% E3% 83% BC% E3% 83% AB% E5% 95% 8F% E9% A1% 8C) est une mystérieuse "réponse subjective et réponse probabiliste ne correspondent pas" C'est un problème. Cette fois, j'ai écrit un programme de simulation simple pour ce "problème de Monty Hall". Hourra empirique!


import random

def monty_hall():
    # 0,1,La bonne réponse est choisie au hasard à partir de la porte de 2
    answer = random.randrange(3)

    #Le répondeur est 0,1,Choisissez votre porte préférée parmi 2
    first_choice = random.randrange(3)

    #Le modérateur, Monty, ouvre une porte à la périphérie
    monty_choice = random.choice(tuple({0, 1, 2} - {answer, first_choice}))
    
    #Comme deuxième choix, le répondant choisit une porte différente de celle qu'il a choisie en premier.
    second_choice = ({0, 1, 2} - {first_choice, monty_choice}).pop()
    
    #La porte que vous avez choisie la deuxième fois est-elle la bonne réponse??
    return answer == second_choice

if __name__ == '__main__':
    for x in (10, 100, 1000, 100000):
        #Pendant les essais X, monty_hall()Enregistre le nombre de fois qui a renvoyé True.
        win = sum(1 for _ in range(x) if monty_hall())
        print("Nombre d'essais{0}Probabilité parfois: {1}".format(x, win / x))

#Probabilité lorsque le nombre d'essais est de 10: 0.7
#Probabilité lorsque le nombre d'essais est de 100: 0.58
#Probabilité lorsque le nombre d'essais est de 1000: 0.673
#Probabilité lorsque le nombre d'essais est de 100 000: 0.66657

Le plus gros problème du "problème de Monty Hall" est "Le challenger devrait-il changer le premier choix après que le modérateur a montré la porte?", Mais "Il est plus probable que la réponse soit correcte." Cela a été confirmé.

À propos, le code ci-dessus est écrit de manière légèrement redondante pour plus de clarté, mais il peut également être remanié comme suit.

def refactoring_month_hall():
    # 0,1,La bonne réponse est choisie au hasard à partir de la porte de 2
    answer = random.randrange(3)

    #Le répondeur est 0,1,Choisissez votre favori parmi les 2 portes
    first_choice = random.randrange(3)

    #La première porte que vous avez choisie n'est pas la bonne réponse=>Une autre porte est correcte
    return answer != first_choice

if __name__ == '__main__':
    for x in (10, 100, 1000, 10000, 100000):
        win = sum(1 for _ in range(x) if refactoring_month_hall())
        print("Nombre d'essais{0}Probabilité parfois: {1}".format(x, win / x))

#Probabilité lorsque le nombre d'essais est de 10: 0.8
#Probabilité lorsque le nombre d'essais est de 100: 0.65
#Probabilité lorsque le nombre d'essais est de 1000: 0.678
#Probabilité lorsque le nombre d'essais est de 10000: 0.6676
#Probabilité lorsque le nombre d'essais est de 100 000: 0.66585

Encore une fois, vous pouvez clairement voir qu'il vaut mieux choisir une porte qui n'est pas le premier choix. C'est étrange (´ ・ ω ・ `)

Recommended Posts

Écrivons un programme de simulation simple pour le "problème de Monty Hall"
Résolvez le problème de Monty Hall
Écrivez un programme pour résoudre le Rubik Cube 4x4x4! 2. Algorithme
Écrivez un programme pour résoudre le Rubik Cube 4x4x4! 3. Mise en œuvre
Comprenez-vous le problème de Monty Hall?
Écrivons un simple solveur de courant continu
Écrivons un programme pour résoudre le Rubik Cube (Partie 2: IDA * Search)
Programme pour rechercher la même image
Écrivons un programme Python et exécutons-le
Affichons un template simple idéal pour le premier Django
Explication intuitive qui ne repose pas sur la formule du problème de Monty Hall et simulation avec Python
Ecrire un programme de dynamique moléculaire super simple en python
Une histoire dont j'ai été très convaincu lorsque j'ai écrit le code du problème Monty Hall et calculé le taux de gain
Ecrire un programme python pour trouver la distance d'édition [python] [distance Levenshtein]
Écrivez un programme pour résoudre le Rubik Cube 4x4x4! 1. Vue d'ensemble
Changez l'invite de bash en une couleur simple pour une visualisation facile
Ecrire un programme qui abuse du programme et envoie 100 e-mails
Ecrire un serveur TCP super simple
L'histoire de l'exportation d'un programme
Apprendre le latin dans le but d'écrire un programme d'analyse de phrases latines (partie 1)