在蒙提霍尔游戏节目中,让你在三扇关着的门中选择,知道一扇门后面是跑车,其他俩都是山羊,当然希望选中赢的是跑车。当你选择后告诉他,比如说1号(中奖情况你不知道),主持人知道车在什么地方,他打开另外一扇门,比如说3号,是羊在那儿。然后问你,要不要改主意选2号。问:改选是不是更有利?
乍一看大家会觉得三门问题难以理解,但是实际上只要简单假设就能轻松理解。
首先我们假设我们每次选择后,在主持人开另一扇山羊的门后我们都会更换门的选择。
现在我们抛开门,我们输的情况是怎样的?(在每次都换选择的情况下)
答案是唯一的,就是我们一上来就选中了跑车的门,这时候我们就输了,更换后是山羊的门。
这样来算,在我们每次都更改选择的条件下,我们输的概率只有1/3。其他都是赢的情况。主持人的选择并不需要参与程序的运行。因为,在必换门的情况下,输赢只跟我们一上来的选择有关系。
理解了以上内容,C语言实现便十分简单。
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
void statistic()
{
static int sum = 0, lose = 0, success = 0;
//初始化奖池
int num_prize = rand() % 3 + 1;
//玩家做出选择
int player_choose = rand() % 3 + 1;
//
if (player_choose == num_prize)
{
++lose;
++sum;
printf("有效次数%d 中奖次数%d 未中次数%d\n", sum, success, lose);
}
else
{
++success;
++sum;
printf("有效次数%d 中奖次数%d 未中次数%d\n", sum, success, lose);
}
}
int main()
{
srand((unsigned int)time(NULL)); //记住这种形式!!
int times = 0, i = 0;
printf("Choose times\n");
scanf("%d", ×);
while (i < times)
{
printf("总第%d次 \n", i + 1);
statistic();
++i;
}
return 0;
}
运行结果(10000次)
总第9998次
有效次数9998 中奖次数6711 未中次数3287
总第9999次
有效次数9999 中奖次数6711 未中次数3288
总第10000次
有效次数10000 中奖次数6712 未中次数3288
可以看出换门赢的概率确实是2/3。