この記事は3年以上前に書かれた記事で内容が古い可能性があります
モンティホール問題実験してみた(python)
2020-01-05
この前忘年会で話題となった話
テレビ番組で最近やってたとか
いつかの就職試験で出た(もちろん外した)ので
私にとっても思い入れのある問題
ルールは以下
0:三つの扉がある。一つは正解(車の扉)。二つは不正解(山羊の扉)。
1:挑戦者は三つの中から一つ扉を選ぶ。
2:司会者(モンティ)は答えを知っており,残り二つの扉の中で不正解の扉を一つ選んで開ける。
3:挑戦者は残り二つの扉の中から好きな方を選べる。このとき扉を変えるべきか?変えないべきか?
参考リンク:
モンティ・ホール問題とその解説
直感だと、扉を変えても変えなくても確率は同じだけど
実際は変えた方が確率は上がるよね
と言う話
解説はこちらがわかりやすかった
一応、念の為、本当に確率が違うのかpythonで実験してみた
コードは以下
% cat montyhall.py #!/usr/bin/env python # coding: utf-8 import random import copy # try回数を決める trycount = 10000 reward1 = 0 # 扉を変えなかった場合の初期値、正解したらこの値が増える reward2 = 0 # 扉を変えた場合の初期値、正解したらこの値が増える # 扉のリストを作る doorsList = ['d1','d2','d3','d4','d5'] print('扉の数: %i' % len(doorsList)) for x in range(trycount): #print('==========') #print('%i 回目' % x) # =========================== # 準備 # =========================== # car(正解)の扉を決める car = 'dummy' # 初期化 car = random.choice(doorsList) # 扉からランダムに選ぶ #print('car: %s' % car) # 選択する扉を選ぶ choice = 'dummy' choice = random.choice(doorsList) # 扉からランダムに選ぶ #print('choice: %s' % choice) # 開かない(残す)扉を決める doorsListOpn = copy.copy(doorsList) # 開かない扉を決める用のリストを作る if car == choice: # 正解の扉と選んだ扉が一致していれば doorsListOpn.remove(car) # 正解の扉以外 nopn = random.choice(doorsListOpn) # 正解の扉以外から、開かない扉を決める else: # 一致していなければ nopn = car # 正解の扉が開かない扉 #print('nopn: %s' % nopn) # =========================== # 扉を変えない場合 # =========================== if choice == car: reward1 += 1 #print('reward1: %i' % reward1) # =========================== # 扉を変えた場合 # =========================== if nopn == car: reward2 += 1 #print('reward2: %i' % reward2) print('扉を変えないで成功した場合の回数: %i' % reward1) print('扉を変えて成功した場合の回数: %i' % reward2) rate = float(reward2)/float(reward1) print('変えなかった場合と比べて変えた場合の成功率: %f' % rate)
いざ、実行
% python montyhall.py 扉の数: 5 扉を変えないで成功した場合の回数: 1954 扉を変えて成功した場合の回数: 8046 変えなかった場合と比べて変えた場合の成功率: 4.117707
% python montyhall.py 扉の数: 5 扉を変えないで成功した場合の回数: 2010 扉を変えて成功した場合の回数: 7990 変えなかった場合と比べて変えた場合の成功率: 3.975124
% python montyhall.py 扉の数: 5 扉を変えないで成功した場合の回数: 1993 扉を変えて成功した場合の回数: 8007 変えなかった場合と比べて変えた場合の成功率: 4.017561
すごい、扉5枚の場合は4倍にちゃんとなる
youtubeで紹介されていた3枚扉にすると
ちゃんと2倍に落ち着く
% python montyhall.py 扉の数: 3 扉を変えないで成功した場合の回数: 3298 扉を変えて成功した場合の回数: 6702 変えなかった場合と比べて変えた場合の成功率: 2.032141
% python montyhall.py 扉の数: 3 扉を変えないで成功した場合の回数: 3356 扉を変えて成功した場合の回数: 6644 変えなかった場合と比べて変えた場合の成功率: 1.979738