また、プログラムも組んで理論解と数値解の比較もしてみる
モンティ・ホール問題
3つの箱があり、その内1つにアタリがある
最初に自分は箱を1つ選ぶ
その後、司会者は「自分が選んだ箱」以外からハズレの箱を1つ公開する
自分は箱を選び直す権利があるが、選び直すべきか?
3つの箱があり、その内1つにアタリがある
最初に自分は箱を1つ選ぶ
その後、司会者は「自分が選んだ箱」以外からハズレの箱を1つ公開する
自分は箱を選び直す権利があるが、選び直すべきか?
直感的には選び直しても確率は変わらないように思えるが、選び直すのが正解
いつ見ても不思議な問題w
理論解(ベイズの定理)
箱をそれぞれ、箱1、箱2、箱3とする自分は箱1を選択し、司会者が箱2をハズレ宣言したとき、それぞれの箱のアタリの確率を求める
事象A:箱1にアタリが入っている
事象B:司会者が箱2をハズレだと宣言する
とすると、それぞれの箱のアタリが入っている確率は、
箱1のアタリ確率はベイズの定理より P(A|B)=\frac{P(B|A) P(A)}{P(B)}
P(A)は「箱1にアタリが入っている」確率なので P(A)=\frac{1}{3}
P(B|A)は「箱1がアタリのとき、司会者が箱2を選ぶ」確率
箱1がアタリで、かつ自分は箱1を選んでいるため、司会者の選択肢は箱2、箱3の2択になる。よって P(B|A)=\frac{1}{2} P(B)は「司会者が箱2をハズレだと宣言する」確率
箱1を自分が選んでいるため、司会者の行動は下記の4通りになる
よって P(B)=\frac{2}{4}=\frac{1}{2} 以上より、
箱1にアタリがある(再選択せずにアタリを引く)確率は
P(A|B)=\frac{P(B|A) P(A)}{P(B)}=\frac{\frac{1}{2}\frac{1}{3}}{\frac{1}{2}}=\frac{1}{3} 箱3にアタリがある(選び直してアタリを引く)確率は 1-P(A|B)=1-\frac{1}{3}=\frac{2}{3}
よって、事象B:司会者が箱2をハズレだと宣言する
とすると、それぞれの箱のアタリが入っている確率は、
・箱1 | : | ||
・箱2 | : | (∵司会者は箱2がハズレと宣言してる) | |
・箱3 | : | (∵上記の余事象) |
箱1のアタリ確率はベイズの定理より P(A|B)=\frac{P(B|A) P(A)}{P(B)}
P(A)は「箱1にアタリが入っている」確率なので P(A)=\frac{1}{3}
P(B|A)は「箱1がアタリのとき、司会者が箱2を選ぶ」確率
箱1がアタリで、かつ自分は箱1を選んでいるため、司会者の選択肢は箱2、箱3の2択になる。よって P(B|A)=\frac{1}{2} P(B)は「司会者が箱2をハズレだと宣言する」確率
箱1を自分が選んでいるため、司会者の行動は下記の4通りになる
-
・箱1がアタリの場合は2通り(箱2or箱3)
・箱2がアタリの場合は1通り(箱3のみ)
・箱3がアタリの場合1通り(箱2のみ)
よって P(B)=\frac{2}{4}=\frac{1}{2} 以上より、
箱1にアタリがある(再選択せずにアタリを引く)確率は
P(A|B)=\frac{P(B|A) P(A)}{P(B)}=\frac{\frac{1}{2}\frac{1}{3}}{\frac{1}{2}}=\frac{1}{3} 箱3にアタリがある(選び直してアタリを引く)確率は 1-P(A|B)=1-\frac{1}{3}=\frac{2}{3}
選び直した方がアタリの確率が高い
数値解(モンテカルロ法)
C++で組むとこんな感じ。一応、箱の数が3つ以上の場合にも対応した作り再選択をしないパターンだと、結果がわかりにくいので、「再選択したときのアタリ確率」を求める
結果は
- /**
- MontyHall.cpp
- Monty Hall問題で、再選択時のアタリ確率
- */
- #include<iostream>
- #include<cstdlib>
- #define N 50000000 // 試行回数
- #define NUM 3 // 箱の数
- int main() {
- // 正解数をカウント
- long count = 0;
- // 試行回数分ループ
- for(long i = 0; i < N; i++) {
- // 箱の作成
- bool box[NUM];
- for(int n = 0; n < NUM; n++) box[n] = false;
- box[rand()%NUM] = true;
- // 自分の選択
- int my_select = rand() % NUM;
- // 司会者の選択
- int order_select;
- do {
- order_select = rand() % NUM;
- } while(order_select == my_select || box[order_select]);
- // 解の変更
- int change_select;
- do {
- change_select = rand() % NUM;
- } while(my_select == change_select || order_select == change_select);
- // 結果
- if(box[change_select]) count++;
- }
- std::cout<< "結果:"<< (double)count / N << std::endl;
- return 0;
- }
$ g++ MontyHall.cpp $ ./a.out 結果:0.666652分数にすると「2/3」になる
やはり、理論解と一致した
結論
モンテホール問題は選び直した方が確率が高くなるしかし、
いろんな確率の本を読んでいると、主観依存だから(ryとか、モデルの設定で変わるから(ryとか
もはや哲学の域で「確率とは何なのか」って感じで発狂したくなる
いろいろな解釈があるけど、数値解でも同様の結果になることから、僕は「確率は上がる」と主張したい
0 件のコメント:
コメントを投稿