間違いなく最良の選択肢が存在するような、非常に限定された特殊な状況においてさえ、ケンブリッジ の心理学者、デイヴィッド・グッドの言葉によれば「人間は、理にかなったモデルの厳格な基準に従う ことが苦手なのである。」という。グッドは、普段は分別ある市民を興奮で思考の混乱に追い込ませる、 モンティ・ホールとして知られる問題を例に挙げた。このゲーム番組の出場者は、バラエティ番組には ありがちな、恥ずかしくなるようなゲームをやらされた後で、A,B,Cの三つのドアの一つを開ける 権利を得る。このうち二つのドアの後ろには、子供が風呂遊びで使うプラスティックのアヒルのおもちゃ が置かれ、もう一つのドアの後ろには、一万ドルが置かれている。出場者は、自分の選んだドアの後ろ に置かれた商品をもらえる。聴衆の興奮が高まるなか、Aのドアが選ばれる。司会者のモンティは、Cの ドアを開けて(モンティはどのドアに何が隠されているのかを、すべて承知している)アヒルのおもちゃが 置かれているのを見せて、さらに緊張を高める。ここで出場者は、自分の決定を変えるチャンスを与えられる。 AではなくBを選んだらどうか、と。どうしたらよいのか?というような内容なのだが、その次の行で「読者は自分の力で答えを出して欲しい」と書いてある。そこで 自分なりに考えた。まず、Cを開けてしまったのだからAもBも1/2で同じ確率だろうと思った。でもよく 考えて見ると、Aを選ぶ段階でAにお金がある確率は1/3のはずなので、それが変わるのが非常に奇異に 思える。僕はそこで、シミュレーションをしてみることにした。皆さんも以下の結果を見る前にじっくり 考えてみて欲しい。
デイヴィッド・グッドが書き留めているように、「多くの人は、説明を受けたあとも、なかなかその推論を 理解できない」のである。ということなのだが、皆さんは納得できただろうか。
#!/usr/local/bin/ruby $s = 0 #最初に当たり回数をカウントする変数($s)を0に。 def monty #モンティホールの選択を1回試行するサブルーチン。 ans=rand(3) #答え(ans)を乱数で決める。 first=rand(3) #最初にあてずっぽうで開けようと思う扉(first)を決める for i in 0..2 #モンティさんが開けるドア(open1)は、はずれであり、かつ最初に if i != ans and i != first # あけようと思ったものでもないどれかの扉。 open1=i break end end for i in 0..2 #回答者が開けるドア(decide)は、考えを変えたのだから、 if i != first and i !=open1 # 最初のドア(first)ではなく、かつ、モンティさんの開けた decide = i # (open1)でもないどれかのドア。 break end end if ans == decide #で、決定した(decide)ドアが、当たり(ans)と合っていれば $s += 1 # $sに1を加える。 end end for i in 0..1000 #これを1000回繰り返す。 monty end p $s #で、結果はいかに?このプログラムの実行結果。
$ monty.rb 683 $ monty.rb 666 $ monty.rb 658 $ monty.rb 659 $ monty.rb 663 $ monty.rb 676 $ monty.rb 694
2005年2月8日追記
このプログラムに関して誤りが指摘されていますが、それは誤解です。
プログラム中で、変数ansとfirstが一致したときの残りの扉は区別できないので、
モンティさんの選択を一方に固定しても確率は変わらないはずです。
実行速度の点からこのようにしてあり、誤りではありません。