モンティホール・ジレンマという問題があります。例えば,こんなモノ。
中古パソコン屋に行った AIAN は,「一律100円」と書いてあるジャンク箱の前で足が止まりました。中には,ギガビット・イーサネットカードが3枚入っています(それぞれ NIC-A,NIC-B,NIC-C とする)。100円といったら,言うまでもなく,超破格値です。
ただ,カードが入っているのはジャンク箱。ジャンクは不良品でも返品することができません。どれを選んだらいいでしょう。
ここで,AIAN は当てずっぽうに NIC-B を選びました。レジに持っていくと,店主さんがこう言います。
「本当にそれでいいの?あそこのカード,1つだけちゃんと動いて,残りは動かないんだ。僕はどれがちゃんと動くか知っているよ。あんたが持っているカードが動くかどうかは言えないけれど,とりあえず NIC-A は動かないよ。」
そう言って,NIC-A をポッキリ折りました。
さて,手持ちのお金が100円しかない(泣)として,AIAN は NIC-B を買うべきでしょうか,NIC-C に変えるべきでしょうか。
あ,レジに持っていったら105円だったってのは,無しということで……はい。
現実にどっちを選ぶかは,本人の自由なんでしょうけれど(アニマのお導きということもある),「NIC-C に変える」方が当たりの確率が高いんだそうです。そのままだと 1/3 の確率で当たり,変えると 2/3 の確率で当たりとのこと……。一見すると,1/2 ずつのようにも見えるんですけどね。
よく考えてみると,AIAN が NIC-B を選んだ時点で,NIC-B が当たりの確率は 1/3 です。これは,店主さんが NIC-A をポッキリやった後でも同じです。他方,NIC-C に変えるということは,NIC-C が 1/3 の確率で当たりであるのと同時に,NIC-A が当たりである可能性が無くなることも表しています。つまり,NIC-C と NIC-A の間で「場合の数」が減ることから,NIC-C の重みが NIC-A の確率分だけ増えると考えられそうです(多分)。
今日は,ずっとこの問題に悩まされていました。頭の中だけ云々するのもなんなので,簡単なプログラムで実験です。乱数をどうやって生成するのか分からなかったんですけれど,random(3) を使ってみました。rand(3) よりは質のいい乱数を生成するみたい。
#include <stdio.h>
#include <stdlib.h>
#define TEST_TIME 5
#define CHALLENGE 10000
int main()
{
int i, n;
int answer;
int selection;
int changed;
int unchange;
for (i = 0; i < TEST_TIME; i++) {
changed = 0;
unchange = 0;
for (n = 0; n < CHALLENGE; n++) {
/* set the answer card */
srandomdev();
answer = random() % 3;
/* AIAN's select */
srandomdev();
selection = random() % 3;
/* test */
if (selection == answer)
unchange++;
else
changed++;
}
printf("<< TEST %02d [%d times test] >>\n", i + 1, CHALLENGE);
printf("Changed : %d\n", changed);
printf("Unchanged : %d\n", unchange);
}
return 0;
}
10000回チャレンジして,「変えた場合」と「変えなかった場合」とで,当たりの確率を見てみます。あまり意味は無いけど,さらにこれを5回繰り返し……。結果は,
<< TEST 01 [10000 times test] >>
Changed : 6640
Unchanged : 3360
<< TEST 02 [10000 times test] >>
Changed : 6674
Unchanged : 3326
<< TEST 03 [10000 times test] >>
Changed : 6764
Unchanged : 3236
<< TEST 04 [10000 times test] >>
Changed : 6662
Unchanged : 3338
<< TEST 05 [10000 times test] >>
Changed : 6609
Unchanged : 3391
やっぱり,「変えた場合」に当たる確率は 2/3 くらいですね。頭で理解できて,コンピュータで実証されても,直感的には 1/2 だと思っちゃいます。
ともあれ,これ以上考えると頭がこんがらがってくるので,興味のある方は以下のリンクあたりを参照してください……。もうギブアップ。
「モンティ・ホールの問題をどう考えるか」(塩沢由典)
「モンティ・ホール ジレンマの誤解」(西山伸)