三门问题网上已经有很多解释了,笔者这里给一个非常简单的证明方式。
在你选择一扇门后,概率确定是三分之一。这时外面无论发生什么事你都认定这扇门不改变,那猜中正确门的概率仍然是三分之一。
这时候有个人就硬要打开除了你选择的门以外的一扇错误门,那他这个行为是必然的,他肯定能打开一个错误门,就像明天太阳会升起一样,他打开他的门,明天太阳升起就继续升起,跟你选的门正确与否没一毛钱关系。
此时可以发现,你选择的门正确概率没发生改变仍然是三分之一。
那么此时你要是换到没被你选择和没被那个人打开的门,它的概率就会是三分之二。
接下来就是c语言验证,笔者是在单片机上面跑的,试了好几个数字,发现循环次数只要小于317,函数返回0,如果大于等于317,函数就会返回1,可能单片机的随机有点不随机吧。。。下面是代码:
//i是随机选的门,j是随机正确的门, k是排除的门, m是最终选的门, a是选正确的次数, b是总次数
unsigned char xxx(){
int b;
int a;
float result;
for(b=0; b<317; b++){
unsigned char i = rand()%3;
unsigned char j = rand()%3;
unsigned char k, m;
while(1){
k = rand()%3;
if(k != i && k != j)
break;
}
if(0 != i && 0 != k)
m = 0;
else if(1 != i && 1 != k)
m = 1;
else
m = 2;
if(m == j)
a++;
}
result = (float)a/(float)b;
if(result > 0.66 && result < 0.67)
return 1;
else
return 0;
}