[PYTHON] Comprenez-vous le problème de Monty Hall?

Je ne sais pas si cela correspond à mon intuition ou non, donc le problème de Monty Hall est devenu un incontournable des problèmes de quiz de probabilité. Mais comprenez-vous vraiment?

Problème de Monty Hall

Il y a trois portes, A, B et C. Une seule des trois portes est un succès et les deux autres sont fermées. Le jeu se joue selon la procédure suivante.

  1. Le joueur choisit l'une des trois portes
  2. Le modérateur, Monty, ouvre une porte que le joueur n'a pas choisie pour animer le jeu. Monty connaît la réponse à l'avance et ouvre toujours la porte
  3. Le modérateur Monty demande au joueur: "Vous pouvez maintenant passer à la porte restante. Voulez-vous la changer? Voulez-vous la changer?"

Question: Le joueur doit-il changer la porte ou non? Plus précisément, en changeant de porte, les chances de gagner augmenteront, diminueront ou ne changeront pas.

Réponse: Les joueurs doivent changer la porte. Puisque le joueur a choisi l'une des trois portes, la chance de gagner la porte choisie est de 1/3. De plus, la probabilité qu'une des portes non sélectionnées soit un succès est de 2/3. Et Monty a ouvert une des portes qu'il n'a pas choisie. Par conséquent, la probabilité que la porte restante soit un succès est de 2/3. En d'autres termes, en changeant la porte, les chances de gagner sont augmentées de 1/3 à 2/3.

Problème de Monty Hall quand une rafale de vent souffle

Mais que se passerait-il si Monty ne l'ouvrait pas, mais qu'une rafale de vent ouvrait la porte? La rafale est un accident, pas le but d'exciter le jeu, il est donc possible d'ouvrir la porte de votre choix ou la porte que vous frappez. Nous supposons également que la probabilité d'une ouverture de porte est la même.

  1. Le joueur choisit l'une des trois portes
  2. Lorsque le modérateur Monty a tenté d'animer le jeu, une rafale de vent a soufflé et l'une des portes s'est ouverte.
  3. Si la porte sélectionnée par le joueur en 1 s'ouvre, ou si la porte gagnante s'ouvre, ce jeu sera annulé car il ne peut pas être continué.
  4. Si une porte que le joueur n'a pas choisie s'ouvre et qu'elle est fermée, le jeu continue et Monty reprend son esprit et demande au joueur: «Maintenant, je peux passer à la porte restante. Vous pouvez. Voulez-vous le modifier? Souhaitez-vous le modifier? "

Question: Le joueur doit-il changer la porte ou non? Plus précisément, en changeant de porte, les chances de gagner augmenteront, diminueront ou ne changeront pas.

Réponse: Les chances de gagner sont les mêmes, que vous changiez de porte ou non. e? Si vous le changez, la probabilité est de 2/3? De quoi parlez-vous?

Avez-vous compris

Quelqu'un qui comprend d'une manière ou d'une autre le problème de Monty Hall peut ne pas être convaincu par les conséquences d'une rafale de vent. Que ce soit Monty qui l'ouvrit ou une rafale de vent, la conclusion fut la même car la porte de la périphérie que le joueur n'avait pas choisie s'ouvrit. Tu ne le pensais pas?

Voler Monty Python

Ici, on peut dire que la théorie des probabilités est désordonnée. Cependant, comme vous le savez tous, [Monty est Python](https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3 % E3% 83% BB% E3% 83% 91% E3% 82% A4% E3% 82% BD% E3% 83% B3). Ici, j'aimerais que vous vous convainciez de force en simulant le problème de Monty Hall et le problème de la rafale de vent de Monty Hall avec Python.

Problème ordinaire de Monty Hall


import random

N = 100000
first_choice_is_atari = 0
second_choice_is_atari = 0
for _ in range(N):
    #Tout le monde a raison
    atari = random.choice(["A", "B", "C"])

    #Tout d'abord, choisissez-en un
    first_choice = random.choice(["A", "B", "C"])

    #Monty ouvre quelque chose qui n'est ni un hit ni un élu
    monty_opened = random.choice(list({"A", "B", "C"}.difference(atari).difference(first_choice)))                  
                                                                                                                    
    #Ensuite, il n'y a qu'une seule chose que vous n'avez pas encore ouverte et que vous n'avez pas choisie.?                                                  
    second_choice_candidates = list({"A", "B", "C"}.difference(first_choice).difference(monty_opened))              
    assert len(second_choice_candidates) == 1                                                                       
    #Si vous voulez changer, vous pouvez changer
    second_choice = second_choice_candidates[0]                                                                     
                                                                                                                    
    if first_choice == atari:                                                                                       
        first_choice_is_atari += 1
    elif second_choice == atari:
        second_choice_is_atari += 1
    else:
        raise ValueError("Unreachable")
#Probabilité de gagner si elle n'est pas modifiée,Probabilité de gagner en cas de modification
print(first_choice_is_atari / N, second_choice_is_atari / N)

Je l'ai écrit d'une manière simple et facile à comprendre sans tenir compte de l'efficacité. Ce n'est pas précis car il utilise des nombres aléatoires, mais quel que soit le nombre de fois que vous l'exécutez, il devrait être d'environ 1/3 si vous ne le changez pas et 2/3 si vous le changez.

Problème de Gale Monty Hall


import random

N = 100000
first_choice_is_atari = 0
second_choice_is_atari = 0
game_canceled = 0
for _ in range(N):
    #Tout le monde a raison
    atari = random.choice(["A", "B", "C"])

    #Choisissez-en un
    first_choice = random.choice(["A", "B", "C"])

    #Un coup de vent souffle et on s'ouvre
    wind_opened = random.choice(["A", "B", "C"])

    #Si la bonne réponse s'ouvre ou si le premier choix s'ouvre, le jeu sera annulé.
    if wind_opened == atari or wind_opened == first_choice:
        game_canceled += 1
        continue

    #Si vous continuez le jeu, il n'y a qu'une seule chose que vous n'avez pas encore ouverte et que vous n'avez pas choisie.?
    second_choice_candidates = list({"A", "B", "C"}.difference(first_choice).difference(wind_opened))
    assert len(second_choice_candidates) == 1
    #Si vous voulez changer, vous pouvez changer
    second_choice = second_choice_candidates[0]

    if first_choice == atari:
        first_choice_is_atari += 1
    elif second_choice == atari:
        second_choice_is_atari += 1
    else:
        raise ValueError("Unreachable")
#Probabilité de gagner si elle n'est pas modifiée,Probabilité de gagner en cas de modification,Probabilité de ne pas pouvoir continuer le jeu
print(first_choice_is_atari / N, second_choice_is_atari / N, game_canceled / N)

C'est aussi un nombre aléatoire, donc ce n'est pas précis, mais cette fois, il devrait être d'environ 22% avec ou sans changement.

Laissons Python faire de notre mieux. Cette fois, je vais essayer de savoir d'où viennent ces 22% en listant tous les modèles au lieu de nombres aléatoires.

Découvrez le mystère de la rafale


from itertools import product

first_choice_is_atari = 0
second_choice_is_atari = 0
game_canceled = 0

print("|Frappé|Premier choix|Rafale|résultat|")
print("|------|----------|----|--------|")
for atari, first_choice, wind_opened in product("ABC", repeat=3):
    if atari == wind_opened or first_choice == wind_opened:
        result = "Annuler"
        game_canceled += 1
    elif atari == first_choice:
        result = "Ne changez pas"
        first_choice_is_atari += 1
    else:
        result = "Changement"
        second_choice_is_atari += 1
    print("|     {}|         {}|   {}|{}|".format(atari, first_choice, wind_opened, result))

print("")
total = first_choice_is_atari + second_choice_is_atari + game_canceled
print(first_choice_is_atari / total, second_choice_is_atari / total, game_canceled / total)

Une table au format Markdown est sortie. Si vous comptez le cas où la personne qui ne change pas gagne («ne change pas») et le cas où la personne qui change gagne («change»), vous pouvez voir qu'il y en a 6 chacun. Avec ou sans changement, il y a 6 voies sur 27 au total, donc 6/27 = 2/9 = 22,2222 ...%.

Frappé Premier choix Rafale résultat
A A A Annuler
A A B Ne changez pas
A A C Ne changez pas
A B A Annuler
A B B Annuler
A B C Changement
A C A Annuler
A C B Changement
A C C Annuler
B A A Annuler
B A B Annuler
B A C Changement
B B A Ne changez pas
B B B Annuler
B B C Ne changez pas
B C A Changement
B C B Annuler
B C C Annuler
C A A Annuler
C A B Changement
C A C Annuler
C B A Changement
C B B Annuler
C B C Annuler
C C A Ne changez pas
C C B Ne changez pas
C C C Annuler

La probabilité est difficile. Alors bougeons nos mains

Le problème de la probabilité est difficile. Et il est encore plus difficile d'obtenir la confirmation que la réponse au problème de probabilité est vraiment bonne ou mauvaise. Mais c'est à ce moment que les langages de programmation deviennent un partenaire rassurant.

En fait, préparer une porte et M. Monty et souffler une rafale de vent jusqu'à ce que la porte s'ouvre est une tâche assez difficile, mais elle est trop grande pour attribuer des nombres aléatoires sur un ordinateur et effectuer une simulation appropriée. Si vous n'avez pas de problème, vous pouvez l'essayer tout de suite. En outre, l'énumération et le comptage de tous les modèles sont limités à des problèmes plus petits, mais même ainsi, le problème de Monty Hall n'est pas du tout un problème.

Faites-le vous-même avant de vous sentir confus ou trompé. Vous pouvez voir un monde différent.

En passant, si vous avez la capacité de réserve, pourquoi ne pas essayer d'énumérer tous les modèles pour voir pourquoi changer la porte réduit la probabilité à 2/3 dans le problème de Monty Hall où le vent ne souffle pas.

Recommended Posts

Comprenez-vous le problème de Monty Hall?
Résolvez le problème de Monty Hall
Écrivons un programme de simulation simple pour le "problème de Monty Hall"
Comprenez-vous correctement l'intervalle de confiance? Quelle est la différence avec la section sur les condamnations?
Comment faites-vous "les trois premiers mots que vous avez trouvés"?
Quel jour achetez-vous de l'argent?
Combien connaissez-vous les bases de Python?
Examiner le double problème
Ce que vous pouvez faire avec les statistiques de la bibliothèque Python standard