モンティ・ホール問題をシミュレーションしてみる

モンティ・ホール問題

こんなのを読んでたら、モンティ・ホール問題なんてのがあったので それをpythonシミュレータを作ってやってみた。

モンティ・ホール問題とは詳しくはこちら

下記引用

1.ドアが3つあります 2.その中に 当りが1つ、ハズレが2つ あります 3.あなたは、ドアをひとつ選べます  4.あなたが選んでいないドアを司会者が開けます 5.開けられたドアは 必ず「ハズレ」です 6.あなたは、ドアを選びなおす権利があります 7.選びなおさない権利もあります

問い・・・あなたはドアを選びなおしますか?  ※選びなおした方が、勝率が上がると思いますか?

シミュレータ作成

さて、選び直すことにより正答率が2倍になります(2/3の確率で当てられる)。 詳しい論理はこちらで。

それより本当に2/3の確率で当てられるのか、を知りたかったので実際にシミュレータを作ってみた。 コンピュータにやらせるので試行回数は1000万回で…。

import random
import math

# 選択肢の数を設定
choices = 3

# 当たった回数をカウントする
win_count = 0
# 外した回数をカウントする
lose_count = 0
# 試行回数を設定
try_count = 10000000

# try_count回試行する
for i in range (0,try_count):
  # 解答を選択肢の数の中からランダムに設定する
  answer = math.ceil(random.random()*choices)
  
  # 解答者の解答を選択肢の中からランダムに設定する
  respondent = math.ceil(random.random()*choices)
  
  # 司会者が解答をひとつだけ残す(=不要な選択肢の除外=5.開けられたドアは 必ず「ハズレ」です)
  # chairperson変数にいれる
  if answer == respondent:
      chairperson_flag = 0
      # もし解答者の解答が正しいなら、解答者以外のものなら何を残してもよい
      # 乱数で選んで、解答者と一緒だったときのみ再度乱数で選ぶ
      while chairperson_flag == 0:
          chairperson = math.ceil(random.random()*choices)
          if chairperson != answer:
              chairperson_flag =1
  else:
      # 解答者が不正解なら解答を残さないといけない
      chairperson = answer
  
  # 解答者は司会者が残してくれたものに解答を変える
  respondent = chairperson
  
  # あたってたら正解数を増やす
  if respondent == answer:
      win_count += 1

# 結果
print("正解は" + str(win_count) + \"回\")
print("不正解" + str(try_count - win_count) + "")
print("正答率は" + str((win_count/try_count)*100) + "%")

さて、実行結果は…

python monty.py
正解は6665866回
不正解3334134回
正答率は66.65866%

はい、2/3の確率で間違いなさそうですね。 ベイズ学んでみると面白い。