モンティ・ホール問題

っていうんだって。
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++;

と書き換えて同じなので、「扉を変更して当たる確率」というのは、「最初に選んだ扉以外が当たる確率」と等しいことがわかります。

シミュレーションを考えると確率はわかりやすいですねー