プレーヤーの前に閉じた3つのドアがあって、1つのドアは「当たり」、残り2つのドアは「外れ」である。
プレーヤーが1つのドアを選択した後、司会者が残りのドアのうち「外れ」ドアを開ける。
ここでプレーヤーは、最初に選んだドアを、残っている開けられていないドアに変更してもよい。
ここでプレーヤーはドアを変更すべきだろうか?
直感では残った2つのドアのどちらかが当たりなので、ドアを変更してもしなくても正解率は50%だ。
しかし実際の正解率は、ドアを変更しなければ33.33%、ドアを変更すれば66.66%である。
これがモンティ・ホール問題。
以下は普通のモンティ・ホール問題のシミュレーション。
function MHQuestionKnown() { var door = ["","",""]; door[Math.floor(Math.random() * 3)] = "o"; var youOpen = 0; var shikaiOpen = (door[1] == "o" ? 2 : 1); // 司会者は外れのドアを開ける return (door[youOpen] == "o" ? 1 : 0); } var okCnt = 0; for(var i=0; i<10000; i++) { okCnt += MHQuestionKnown(); } console.log(okCnt/10000); // だいたい 0.33 = 33% になる
この問題のキモは、問題文には明記されていないけれど実は司会者が正解を知っているという事にある。
「残っている開けられていないドアに変更する」というのは、実は司会者が知っている知識を使って当たりを引く確率を上げるという行為なのだ。
全く同じことをするが司会者が正解を知らず、もし偶然に司会者が「当たり」を開けてしまった場合はもう一度最初からやりなおすというルールに変更すれば、ドアを変更してもしなくても正解率は50%という直感通りの確率になる。
以下はそのシミュレーションをしたコード。
function MHQuestionUnknown() { do { var door = ["","",""]; door[Math.floor(Math.random() * 3)] = "o"; var youOpen = 0; var shikaiOpen = Math.floor(Math.random() * 2) + 1; // 司会者はランダムにドアを開ける } while(door[shikaiOpen] == "o"); return (door[youOpen] == "o" ? 1 : 0); } var okCnt = 0; for(var i=0; i<10000; i++) { okCnt += MHQuestionUnknown(); } console.log(okCnt/10000); // だいたい 0.5 = 50% になる