Après avoir vérifié le problème de Montyhall avec Ruby, c'était une histoire que je pouvais bien comprendre et que je ne comprenais pas bien

Quel est le problème de Monty Hall?

Le problème de Montyhall est un ** problème de probabilité qui n'est pas intuitivement convaincant **. Je ne me sentais pas rafraîchi quand je l'ai recherché sur le net, j'ai donc décidé de le vérifier moi-même.

Vous pouvez avoir un aperçu sur ce site, mais je vais vous expliquer un peu sur cette page également.

Vue d'ensemble du problème de Montyhall

Lorsque vous sélectionnez une case, cela ouvrira l'une des valeurs aberrantes. Après cela, lorsque vous pouvez modifier la case sélectionnée, la question est de savoir quel est le meilleur moyen de modifier ou de ne pas modifier les options.

Boîte 1 Encadré 2 Encadré 3
Frappé De De

Par exemple, supposons que l'organisateur du jeu ouvre la boîte d'origine avec la boîte 2 sélectionnée parmi les trois boîtes ci-dessus (pas encore ouvertes). La situation est comme ci-dessous

Boîte 1 Encadré 2 Encadré 3
Frappé De De
choisir OPEN

Si la sélection peut être modifiée lorsque la case 3 est jugée hors service, doit-elle être modifiée? C'est le problème.

Intuitivement, il y a deux choix, «frapper ou manquer», donc il semble que peu importe celui que vous choisissez, mais mathématiquement, c'est comme suit.

Tel quel Changer les choix
Probabilité de gagner 33% 67%

Quand j'ai vu ça pour la première fois, j'ai pensé: "C'est stupide ...". Je n'étais pas tout à fait convaincu en regardant l'explication, donc quand je l'ai vérifiée en utilisant la programmation, j'ai été très déçu, donc je vais l'expliquer. (Mais après tout, de nouveaux mystères se sont multipliés)

Codez et vérifiez immédiatement

Nous vérifierons en utilisant Ruby. (Bien qu'il puisse être remanié un peu plus, il y a certaines parties qui sont intentionnellement écrites de manière redondante afin qu'il soit facile de comprendre ce que vous faites. Pourtant, cela peut être un peu difficile à comprendre ... lol)

code

ruby


#Nombre d'essais (environ 1 million de fois suffit)
number = 1_000_000

#Préparez les succès et les échecs
win = 1
lose = 0

#Préparez une boîte
boxes = [win, lose, lose]

#Cas 1 (lorsque les options ne sont pas modifiées)
count = 0
number.times do
  #Décidez au hasard quelle boîte choisir
  random_number = [0, 1, 2].sample
  selected_box = boxes[random_number]
  #Ouvrez la boîte (ce processus n'a aucun sens car vous ne changerez pas vos options la prochaine fois)
  random_number != 2 ? boxes.delete_at(2) : boxes.delete_at(1)
  #Jugez s'il s'agit d'un succès avec la case sélectionnée
  count += 1 if selected_box == win
end
#Calcul de la probabilité
prob_1 = (count.to_f / number.to_f).round(5) * 100

puts "Probabilité de ne pas changer les options: #{prob_1}%"

#Cas 2 (lors du changement d'options)
count = 0
number.times do
  #Sélectionnez une boîte
  random_number = [0, 1, 2].sample
  selected_box = boxes[random_number]
  #Ouvrez la boîte périphérique et modifiez la boîte sélectionnée
  if random_number == 0
    boxes.delete_at(2)
    selected_box = boxes[1]
  elsif random_number == 1
    boxes.delete_at(2)
    selected_box = boxes[0]
  else
    boxes.delete_at(1)
    selected_box = boxes[0]
  end
  #Jugement
  count += 1 if selected_box == win
end
#Calcul de la probabilité
prob_2 = (count.to_f / number.to_f).round(5) * 100

puts "Probabilité de changer les options: #{prob_2}%"


résultat

C'est le résultat de l'exécution du fichier. Vous pouvez voir que l'intuition est définitivement fausse 6222a43d3cc8b2ba6e6aba05f660e0b6.png

Un petit commentaire

Je vais essayer de résoudre ce problème avec Ruby et expliquer ce que je pensais que c'était. Le point est ** classification des cas selon le premier choix **

Lorsque vous sélectionnez une boîte, elle vous indiquera une boîte qui n'est pas alignée, ce problème peut donc être divisé en deux modèles.

Chaque probabilité est naturellement la suivante

Probabilité de choisir d'abord la box gagnante Probabilité de choisir d'abord la mauvaise boîte
33% 67%

Ensuite, regardons l'histoire de la modification ou non des options à partir d'ici.

Si vous ne modifiez pas vos options

Si vous ne modifiez pas vos options, vous devez d'abord choisir la boîte gagnante. A l'origine, la probabilité de gagner est de 33%, donc dans ce cas la probabilité de gagner est de 33%.

Lors du changement d'options

Lorsque vous modifiez les options, si vous sélectionnez d'abord la case gagnante, vous perdrez et si vous sélectionnez la mauvaise case, vous gagnerez. En d'autres termes, pour finalement gagner, vous devez d'abord sélectionner la mauvaise case. Dans un premier temps, la probabilité de choisir un écart est de 67%, donc dans ce cas, la probabilité de gagner est de 67%.

Un petit doute

J'ai expliqué jusqu'à présent, mais certaines questions ont été soulevées pendant que j'écrivais. Disons qu'un autre participant arrive lorsque la boîte d'origine est ouverte.

ʻA ce moment, du point de vue d'un autre participant, quelle case est la gagnante? ''

C'est normal de poser cette question, mais je ne peux pas l'expliquer correctement, donc si vous êtes familier avec les mathématiques, veuillez commenter.

finalement

Cela a fini par être un peu maussade, mais c'était un problème intéressant! Le problème de Montyhall est simple mais profond ~

Recommended Posts

Après avoir vérifié le problème de Montyhall avec Ruby, c'était une histoire que je pouvais bien comprendre et que je ne comprenais pas bien
L'histoire que je n'ai pas pu construire après l'installation de plusieurs Java sur Windows
Une histoire dans laquelle j'étais vraiment quand j'ai fait triple DES avec ruby
J'ai rencontré un problème selon lequel JS n'est pas lu après la transition de page et JS est lu lorsqu'il est chargé.
Une histoire que même un homme qui ne comprend pas le langage C pourrait ajouter de nouvelles fonctions à Ruby 2.6
Je ne peux pas utiliser SQS qui peut lire le questionnaire avec un scanner → Je pourrais l'utiliser après avoir changé le ver java
Un rapide coup d'œil sur le problème de Monty Hall
[Ruby] J'ai fait un robot avec de l'anémone et du nokogiri.
[JQuery] Un gars que même les débutants pourraient bien comprendre
L'histoire selon laquelle la mise à jour forcée n'a pas pu être mise en œuvre
L'histoire qui a conduit à résoudre l'erreur car postgres n'a pas commencé avec docker-compose up
L'histoire selon laquelle le paramètre de requête de l'application iPhone n'a pas pu être obtenu avec le servlet
J'ai essayé de créer un programme en Java qui résout le problème du voyageur de commerce avec un algorithme génétique
Une histoire qu'un débutant Ruby a fait et a publié un LINE BOT qui raconte l'heure du train en 2 mois
L'histoire selon laquelle la connexion à la base de données et les autres délais d'expiration n'ont pas expiré selon la valeur définie
J'ai essayé d'exprimer les résultats avant et après de la classe Date avec une ligne droite numérique
Lorsque j'ai effectué un test de l'API Jersey, j'ai rencontré un phénomène selon lequel l'API JSR310 ne pouvait pas être désérialisée.
[Rails] Une histoire qui a continué à vérifier incorrectement la raison pour laquelle l'action de mise à jour n'a pas réussi (mise à jour)
J'ai essayé de résoudre le problème de la "sélection multi-étapes" avec Ruby
Une histoire que j'ai eu du mal à défier le pro de la concurrence avec Java
À propos du problème selon lequel l'image n'est pas affichée après le déploiement AWS
[Gradle] L'histoire selon laquelle le fichier de classe n'existait pas dans le fichier jar
Correction d'un problème où l'événement de défilement ne se déclenchait pas dans JQuery
Ce que j'ai fait lorsque la base de données n'a pas démarré avec docker-compose up
Une histoire qui a eu du mal avec l'introduction de Web Apple Pay
L'histoire selon laquelle l'erreur de construction ne s'est pas arrêtée lors de l'utilisation d'Eclipse 2020
Une histoire qui résout le problème que REMOTE_ADDR ne peut pas être acquis dans un cluster construit avec Docker Swarm + Traefik (1.7).
Une histoire à laquelle j'étais accro à deux reprises avec le paramètre de démarrage automatique de Tomcat 8 sur CentOS 8
Je voulais écrire un processus équivalent à une instruction while avec l'API Java 8 Stream
Comment faire fonctionner IGV en utilisant la communication par socket, et l'histoire de la création d'un Ruby Gem en utilisant cette méthode
Je souhaite télécharger un fichier sur Internet en utilisant Ruby et l'enregistrer localement (avec prudence)
L'histoire de l'introduction de Gradle en tant que modernisation d'un système existant qui ne gérait pas de packages
J'ai un LSP et j'ai essayé de créer un environnement pour écrire Java avec Vim (NeoVim), mais je n'ai pas pu battre l'IDE ...