モンティ・ホール問題をシミュレーションしてみる
モンティ・ホール問題
こんなのを読んでたら、モンティ・ホール問題なんてのがあったので それを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の確率で間違いなさそうですね。 ベイズ学んでみると面白い。