Monty Hall問題 #2
少し素直に書き過ぎてコードが複雑になってしまった。
どのドアに当たりを入れるかをランダムに決めるのであれば、
最初に選択するドアは固定で構わないだろう。
選択を変えたときと変えなかったときとは表裏一体の関係であるから、
変えたときに当たった割合を1から引いたものが変えなかったときに当たった割合としていいだろう。
最初に選択するドア番号を0とすれば、
#include <stdio.h> #include <stdlib.h> int main(void) { int i, iter, n_car[2], n_goat[2]; for (i = 0; i < 2; i++) n_car[i] = n_goat[i] = 0; srand48(20111223L); for (iter = 0; iter < 1000000; iter++) { int car = (int)(drand48() * 3); if (car == 0) { n_car[0]++; n_goat[1]++; } else { n_car[1]++; n_goat[0]++; } } for (i = 0; i < 2; i++) printf("%7d %7d %7d\n", n_car[i], n_goat[i], n_car[i] + n_goat[i]); printf("%7d %7d %7d\n", n_car[0] + n_car[1], n_goat[0] + n_goat[1], n_car[0] + n_goat[0] + n_car[1] + n_goat[1]); return 0; }
333425 666575 1000000 666575 333425 1000000 1000000 1000000 2000000
0,1,2をランダムに選んで0になるか否かであり、実行せずとも結果明白なように、
最初の選択を変えなければ当たった割合は0.333、変えた場合は0.667となる。