まずはこちらの問題を見てほしい。
この模範的な回答「開けるドアを変更する」の意味がわからなかった。ホストがドアを開けた後だろうと、前だろうと結果かわんないんじゃないの? というわけで、pythonで検証スクリプトを書いてみた
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import random
all_count = 0
a_count = 0
b_count = 0
c_count = 0
#10万回施行
for x in range(100000):
#正解を決める
ans =random.choice([1,2,3])
#タイプA: ランダムに回答を選ぶ
aans = random.choice([1,2,3])
#違うドアを1つえらぶ(正解のドアではなく、Aの答えのドアでもない)
pseudo_doors = [1,2,3]
pseudo_doors.remove(ans)
if( ans != aans):
pseudo_doors.remove(aans)
pseudo_door = pseudo_doors.pop()
#タイプB: 違うドア以外をランダムに選ぶ
#(Aと同じになるかもしれないし、違うかもしれない)
next_door = [1,2,3]
next_door.remove(pseudo_door)
bans = random.choice(next_door)
#C: 違うドア以外でAと違う回答を選ぶ(模範回答)
next_door = [1,2,3]
next_door.remove(pseudo_door)
next_door.remove(aans)
cans = next_door.pop()
#あたっているかカウント
all_count = all_count + 1
if( aans == ans ):
a_count = a_count + 1
if( bans == ans ):
b_count = b_count + 1
if( cans == ans ):
c_count = c_count + 1
#結果表示
print "施行回数 A B C"
print all_count , a_count , b_count ,c_count
で、実行結果はこちら
$ monty_hall.py 施行回数 A B C 100000 33403 49870 66597
実行毎に微妙に数はずれるけど、だいたい、タイプAは1/3、タイプBは1/2、タイプCは2/3 の確率になる。
A+Cはかならず全体の施行回数になる。考えてみればあたりまえで、ホストが途中で一つの扉を開けることで、Cの「開けるドアを変更する」っていうのは、Aが外れる確率とまったく同じことになる。だから、模範的な回答になるのね。納得できた。