三门问题详解(附C语言实现)
三门问题——违背直觉的概率现象 三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let’s Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门会否增加参赛者赢得汽车的机率?如果严格按照上述的条件,即主持人清楚地知道,自己打开的那扇门后是羊,那么答案是会。不换门的话,赢得汽车的几率是1/3。换门的话,赢得汽车的几率是2/3。
这个问题亦被叫做蒙提霍尔悖论:虽然该问题的答案在逻辑上并不自相矛盾,但十分违反直觉。这问题曾引起一阵热烈的讨论。
在网上参考了各种观点,其理解总结如下:
- 【三门问题详解(附C语言实现)】第一种方法是从概率合并的角度,最容易理解也最直观,在游戏开始之初,A、B、C三扇门的背后有汽车的概率分别为三分之一,那么A门+B门背后有汽车的概率将会是三分之二,而主持人打开B门之后,A门+B门背后汽车的概率为三分之二的这个事实并不会发生改变,那么这就意味着,此时A门背后有汽车的概率已经从最初的三分之一上升到三分之二。主持人打开空门的操作将换门的选项从两个减少到一个,所以概率也随之上升了,所以当然应该改变选择。考虑一种极端的情况,即10000扇门的情况下,换门的成功率将提升至9999/10000。
- 第二种方法则是老老实实的列表计算,该方法最简单,只需列举各种情况再计算相应概率即可。
文章图片
直白地讲,就是把第一次选择和第二次选择的所有情况进行细化,分析出每一种情况下的条件概率,再把这些概率进行加总,得到了最终的结果:
不换门的获奖率 = (1/3 X 100%)+(1/3 X 0%)+(1/3 X 0%)=1/3
换门的获奖率 = (1/3 X0%)+(1/3 X 100%)+(1/3 X 100%) =2/3
用图解的方式也可以更直观地进行理解:
文章图片
- 第三种方法则是通过贝叶斯公式,即
文章图片
也可以很简单地解决这个问题,但是得明确里面的事件A和事件B是代指什么。
我们用事件A代表你第一次选择的门后是汽车,B代表主持人翻开的门后是山羊。那么已知B的情况下,A发生的条件概率 P{A|B} 显然,第一次选对的概率,即 P{A}=1/3,无需赘述。但是由于不知道主持人的行为,所以无法计算 P{B|A} 和P{B}。
那么我们具体分析:因为主持人知道门后对应的东西,所以只选择开启有羊的门,于是主持人一定选择山羊,事件 B 一定发生:P{B|A} = 1 主持人一定选择山羊,事件 B 一定发生:P{B} = 1,那么 P{A|B} = 1/3,所以不换的胜率是1/3,因此一定要换。
那么如果改变条件,主持人并不知道门后有什么东西,那么:P{B|A} = 1而 P{B} = 1/3 * 1 + 2/3 * 1/2 =2/3,得到 P{A|B} = 1/2 。
也就是是说,这种情况下才是换与不换都无所谓的1/2,而显然要求的主持人不知道门后有什么东西,和游戏的限制条件不符合。也就是说1/2肯定是错误的。
多的不说了 附上代码与实验截图
文章图片
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
#include
#include
static const int testCount = 10000;
static int findSwap(int *p, int n, int choose);
int main() {
int n;
printf("请输入门数\n");
scanf("%d", &n);
while (n < 1) {
printf("请重新输入门数\n");
scanf("%d", &n);
}
int *p = (int *)malloc(sizeof(int)*n);
int swapSuccess = 0;
int nonSwapSuccess = 0;
srand((unsigned)time(0));
//重复10000次随机试验
for (int i = 0;
i < testCount;
i++) {//有汽车的那扇门
int car = 1 + rand() % n;
//printf("汽车在第%d 扇门\n",car);
for (int i = 0;
i < n;
i++) {
*(p + i) = 0;
}//参赛者选择的门
int choose = 1 + rand() % n;
//printf("参赛者选择第%d 扇门\n", choose);
int count = 0;
for (int i = 1;
i <= n;
i++) {
if (i != choose && i != car) {
//printf("打开第%d 扇门\n", i);
*(p + i - 1) = 1;
count++;
}
if (count == n - 2) {
break;
}
}
int swap = findSwap(p, n, choose);
//printf("剩下第%d 扇门,是否交换?\n", swap);
//swap == car ? printf("交换成功\n") : printf("交换失败\n");
swap == car ? swapSuccess++ : nonSwapSuccess++;
} printf("交换的成功次数为%d 不交换的成功次数为%d\n", swapSuccess, nonSwapSuccess);
printf("交换成功率为%4.2f\n", swapSuccess*1.0 / testCount);
system("pause");
}//选择是否交换的门
static int findSwap(int *p,int n,int choose) {
for (int i = 1;
i <= n;
i++) {
if (*(p + i-1)==0 && (i!=choose) ) {
return i;
}
}
return -1;
}
选择3门和10000门并重复进行10000次的随机试验
实验截图如下:
文章图片
文章图片
最后,让我们来致敬一下 “三门问题” 的提出者,集才华和美貌于一身的天才人物:玛丽莲·沃斯·莎凡特——吉尼斯认定的最高智商人(IQ:228)。(我记得考研英语有一篇阅读也提到过她的)
文章图片
莎凡特针对三门问题,在她专栏的回答是改选会更有优势。
她认为换了之后有2/3的概率赢得车,不换的话概率只有1/3。莎凡特当时做作出了当时莎凡特的回答在美国也是引起了激烈的争议,甚至于一些批评和人身攻击:
当时人们非莎凡特寄来了数千封抱怨信,很多寄信人都是具备一定文化水平的老师或学者,不少人对此猛烈批评,甚至使用了十分过激的攻击字眼。
比如一位来自佛罗里达大学的读者写道:“这个国家已经有够多的数学文盲了,我们不想再有个世界上智商最高的人来充数!真让人羞愧!”
另一个人阴阳怪气地对她嘲讽道:“我看你就是那只山羊!”
美国陆军研究所的工作人员埃弗雷特·哈曼写道,“如果连博士(莎凡特)都会犯这种错误,我看这个美国马上要陷入严重的灾难中了。”
因为直觉告诉这些写信的人们:如果被打开的门后什么都没有,这个信息会改变剩余的两种选择的概率,哪一种都只能是1/2。
经过统计,持有上述这种观点的大约有十分之一是来自数学或科学研究机构,有的人甚至有博士学位。
还有大批报纸专栏作家也开始加入了声讨莎凡特的行列。在这种情况下,莎凡特选择向全国的读者和粉丝求救,后来有数万名学生进行了模拟试验。一个星期后,实验结果从全国各地反馈回来,经过莎凡特的统计得出,结论就是2/3和1/3。
例如根据福尔曼大学的埃勒维兹·鲁迪的反馈,因为数学课上的大部分老师认为莎凡特是错误的。于是25名老师带着学生们去中学做了大量实验,得到了1480个样本,最后却证明了莎凡特是正确的,即应该换门。
虽然上个世纪七十年代,电脑和模拟仿真都是稀罕物。但随后,麻省理工的数学家和阿拉莫斯国家实验室的程序员都宣布,他们用计算机进行模拟实验的结果,支持了莎凡特的答案。
时隔三十多年后,著名节目《流言终结者》也做实验,一是由于该问题的反直觉,即使时隔多年,照样有人会感到困惑,其次是杰米和亚当这对好基友,再次强有力的印证了莎凡特的答案。
看吧,其中后面的板子共有49个格子,左边的代表是不换,右边的代表是换,随机进行49次实验,板子上被标红的代表选择到了跑车大奖。换羽不换的孰优孰劣,一目了然。以至于主持人称赞道“Totally confirmed”。
质疑精神是值得鼓励的,它推动着科学的发展和人类思想的进步,当你在现实中面临诸如此类的“三门问题”时,应时刻保留一份警醒——感觉可能会欺骗自己。
本文参考资料:
- https://blog.csdn.net/bjweimengshu/article/details/93554722
- https://baijiahao.baidu.com/s?id=1604863307926406800&wfr=spider&for=pc
- https://www.jianshu.com/p/b1fb755945c0?from=groupmessage
- https://www.zhihu.com/question/26709273
- https://www.bilibili.com/video/BV1ws411j7Mb?from=search&seid=11705288125892203672
推荐阅读
- parallels|parallels desktop 解决网络初始化失败问题
- jhipster|jhipster 升级无效问题
- “精神病患者”的角度问题
- Java|Java OpenCV图像处理之SIFT角点检测详解
- C语言浮点函数中的modf和fmod详解
- 解决SpringBoot引用别的模块无法注入的问题
- Hive常见问题汇总
- 姚老师互动问答会|姚老师互动问答会 # 问题001(如何更有智慧的和身边人分享金刚智慧())
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- 【教育故事】|【教育故事】 一个“问题学生”的蜕变