っていうんだって。
http://blog.livedoor.jp/warata2kki/archives/50543491.html
この辺の話題。確かに直感的にはどっちでも同じじゃん、って思うよなあ。
#include <stdio.h> #include <stdlib.h> #include <time.h> #define HIT 1 #define MISS 0 void initbox(int [], const int); int main(const int argc, const char const **argv){ int i, p1, p2, *box, cnt, n=3, test=10; srand((unsigned)time(NULL)); if(argc > 1) n = atoi(argv[1]); if(argc > 2) test = atoi(argv[2]); box = malloc(n * sizeof(int)); for(i=0, cnt=0; i<test; i++){ initbox(box, n); p1 = box[rand()%n]; p2 = (p1 == HIT) ? MISS : HIT; if(p2 == HIT) cnt++; } printf("prob=%f (%d/%d)\n", (double)(cnt)/(double)(test), cnt, test); free(box); return 0; } void initbox(int box[], const int size){ int i; for(i=0; i<size; i++){ box[i] = MISS; } box[rand()%size] = HIT; }
$ ./box 3 1000000 prob=0.666153 (666153/1000000)
ちなみに
p2 = (p1 == HIT) ? MISS : HIT; if(p2 == HIT) cnt++;
の部分は
if(p1 == MISS) cnt++;
と書き換えて同じなので、「扉を変更して当たる確率」というのは、「最初に選んだ扉以外が当たる確率」と等しいことがわかります。
シミュレーションを考えると確率はわかりやすいですねー