「プログラミングのための確率統計」を読む : 1章 モンティホール問題のシュミレーション

Pythonでシュミレーション

回答者が選びなおさない場合
from numpy import *

ok = 0
ng = 0

for num in range(1, 10000):

    door = ["a", "b", "c"]

    answer = random.choice(door)
    choice = random.choice(door)

    if answer == choice:
        ok += 1
    else:
        ng += 1

print "ok = " + str(ok)
print "ng = " + str(ng)

結果は、

ok = 3393
ng = 6606
回答者が選びなおさない場合
from numpy import *

ok = 0
ng = 0

for num in range(1, 10000):

    door = ["a", "b", "c"]

    answer = random.choice(door)
    choice = random.choice(door)

    incorrectanswer = ""

    # 回答者が正解だった場合は、不正解の選択肢しかのこらない
    if answer == choice:
        door.remove(choice)

        # 選択されなかった扉から司会者が不正解の扉をひとつ選ぶ
        incorrectanswer = random.choice(door)
    # 回答者が不正解だった場合は、正解の選択肢しかのこらない
    else:
        door.remove(choice)
        door.remove(answer)

        # 選択されなかった扉から司会者が不正解の扉をひとつ選ぶ。    
        incorrectanswer = random.choice(door)
        door.append(answer)

    # 司会者が不正解の扉を開く。回答者が最初の選択で不正解だった場合は、この時点で正解の選択肢しかのこらない
    door.remove(incorrectanswer)

    choice = random.choice(door)

    if answer == choice:
        ok += 1
    else:
        ng += 1


print "ok = " + str(ok)
print "ng = " + str(ng)

結果は、

ok = 6639
ng = 3360