まずはこちらの問題を見てほしい。
この模範的な回答「開けるドアを変更する」の意味がわからなかった。ホストがドアを開けた後だろうと、前だろうと結果かわんないんじゃないの? というわけで、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が外れる確率とまったく同じことになる。だから、模範的な回答になるのね。納得できた。