#モンティ・ホール問題の解説が納得いかなかったので、モンテカルロシミュレーションしてみた
何回読んでも納得がいかない。
そこでpythonでシミュレーションしてみました。
使い方
引数として、試行回数を指定。
python monty.py 1000
code
import random
import sys
#引数
n = int(sys.argv[1])
#賞を得るのに、成功すると1、失敗すると0を返す
#change ドアを変更するか
#True:変更する
#False:変更しない
def monty(change):
#3枚のドア
doors = [0,0,0]
#乱数でどのドアに賞品があるかを決める
prize = random.randint(0,2)
doors[prize] = 1
#参加者がドアを選ぶ
select = random.randint(0,2)
#続いてmontyがドアを選ぶ
while True:
monty_select = random.randint(0,2)
if monty_select != select and doors[monty_select] == 0:#賞品が無く、参加者が選ばなかったドアを選ぶ
break
if change:#ドアを変更する場合
while True:
select_change = random.randint(0,2)
if monty_select != select_change and select != select_change:#montyも参加者も選ばないドア
select = select_change
break
if doors[select] == 1:#賞を得られたら1を返す
return 1
return 0#賞が得られなければ0を返す
change = 0
nochange = 0
for i in range(n):#指定回数を繰り返す
change += monty(True)
nochange += monty(False)
#結果の表示
print("turn",n, "change",change,"nochange", nochange)
実行結果
何回やってみても、ドアを変えるほうが賞品をもらえる回数がほぼ2倍になりました。
turn 1000 change 700 nochange 320
turn 1000 change 678 nochange 356
turn 1000 change 658 nochange 333
turn 1000 change 649 nochange 310
実行環境
MacBook-Pro-2016
Python 3.5.2 :: Anaconda 4.2.0 (x86_64)