
数学マンガ 「モンティ・ホール問題」その3 ディスカッション
前回その2「解答編」のあらすじ:モンティ・ホール問題を解説し終えて得意げなワシマンですが…。ディスカッションが続きます。
それではワシマンの実験結果を見てみましょう。(実験に使用したプログラムはページ末尾を参照)
「その1」へ戻る…?
お後がよろしい、ということにして、おしまい!
Appendix
実験で使用したプログラム「monty_hall.py」
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import random
import sys
NUMBER_OF_DOORS = 3
def choose_one_randomly(doors):
return random.choice(doors)
def choose_rest(doors, chosen):
return [d for d in doors if d != chosen]
def play_one_game(strategy='switch'):
doors = range(NUMBER_OF_DOORS)
# ①準備
# 司会がランダムに1つ正解のドアを選択する
# - 正解のドア: money_door (賞金)
# - ハズレのドア: blank_doors とする
money_door = choose_one_randomly(doors)
blank_doors = choose_rest(doors, money_door)
# ②回答者の1回目の選択
# 回答者がランダムに1つドアを選ぶ
player_door = choose_one_randomly(doors)
# ③司会者からのヒント
# 司会がハズレのドアからランダムに1つドアを開ける (回答者が選択しているドアを開けてはいけない)
open_door = choose_one_randomly(
choose_rest(blank_doors, player_door) # length can be 1 or 2
)
closed_doors = choose_rest(doors, open_door)
# ④回答者の2回目の選択
# 回答者は stay or switch を選択できる
# - stay: 先ほどの player_door から変更しない
# - switch: もう一方のドアに変更する
if strategy == 'switch':
player_door = choose_one_randomly(
choose_rest(closed_doors, player_door) # length is 1
)
else:
pass
#sys.stderr.write("---money_door: %s, player_door: %s, open_door: %s\n" %(money_door, player_door, open_door))
return money_door == player_door
def iterate(n, strategy):
success = 0
for i in range(1, n+1):
success += play_one_game(strategy)
ratio = float(success) / float(i)
sys.stderr.write("---%ith try, success %s\n" %(i, success))
print("%i,%f" %(i, ratio))
def main():
strategy = 'switch'
n = 1000
args = sys.argv
if (len(args) >= 3):
strategy = args[1]
n = int(args[2])
iterate(n, strategy)
if __name__ == '__main__':
main()
使い方
# switchだけ1000回連続で実行
python monty_hall.py switch 1000
# stayだけ1000回連続で実行
python monty_hall.py stay 1000
数学マンガ「モンティ・ホール問題」は以上でおしまいです。最後まで読んでいただきありがとうございました!