[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