昨天大家吃饭的时候的,聊起今年面试的时候出的一个问题,在原理上跟Monty fall problem是一样的,引起了对于Monty fall 问题的一些思考!首先来说明一下什么monty fall problem。
蒙提霍尔问题,亦称为蒙特霍问题或三门问题(英文:Monty Hall problem),是一个源自博弈论的数学游戏题,大致出自美国的。问题的名字来自该节目的主持人蒙提霍尔(Monty Hall)。
这个游戏的玩法是:参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门就可以赢得该汽车,而另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,知道门后情形的节目主持人会开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门会否增加参赛者赢得汽车的机会率?如果严格按照上述的条件的话,答案是会—换门的话,赢得汽车的机率是2/3。
其实这个游戏的关键就是这个主持人,所以我们要解决这个问题首先要搞清楚的一点就是:无论你选择的哪扇门,当你选择完毕之后主持人肯定会翻开一扇藏有羊的门,这样这个问题就变成了一个条件概率的问题,就是说你在主持人翻开一扇藏有羊的门的概率情况下,改变你第一次选择并且选中汽车的概率是多少。假设你第一次选中汽车的开率记作事件P(A) = 1/3.
主持人翻开一扇藏有羊的门的事件记作:
P(C)=?
P(C)为多少呢,根据游戏的规则,主持人为了让游戏继续下去肯定会翻开一扇藏有羊的门,并且绝对不会翻开你选择的那扇门,所以P(C) = 1!
然后,在主持人翻开了一扇藏有羊的门之后,你该变了自己的选择,就是因为你认为自己第一选中的是羊,这个概率
P(B) = 2/3.
所以在主持人翻开一扇藏有羊的门的情况下你选中车的概率可以做:
P(B|C)=P(BC)/P(C)
P(BC)事件可以陈述为第一次你没有选中羊主持人翻开一扇门,由于你的选择并不会影响到主持人翻开门的行为,所以P(BC) = P(B)=2/3
所以P(B|C)=2/3
所以当主持人翻开一扇藏有羊的门,你改变自己的选择选中车的概率为2/3!
为了证明我们的说法我们可以写一个程序模拟一下这个场景:
- #include<iostream>
- #include<ctime>
- #include<cstdlib>
- using namespace std;
- int main()
- {
- int counter = 0;
- int flag;
- int j;
- int s;
- int i = 1;
- int a[3]; //代表三扇门
- srand(time(0));
- a[0] = 1; //有汽车的门
- a[1] = 0;
- a[2] = 0;
- while(i <= 1000000)
- {
- j = rand()%3; //观众随机选择了一扇门
- /*主持人首先判断观众选择的这扇门中是不是有车,假如有车他会从剩下的两扇中随机的打开一扇门,假如观众选择的门后没有车他会打开另外一扇没有车的门。按照这个逻辑我们将s当作主持人的选择,然后将剩下的一扇门中的结果给flag,判断一下flag=1的次数,就是观众改变自己的选择选中车的概率*/
- if(j == 0)
- {
- s = rand()%2 + 1;
- if(s == 1)
- {
- flag = a[2];
- }
- else
- {
- flag = a[1];
- }
- }
- else if(j == 1)
- {
- flag = a[0];
- }
- else if(j == 2)
- {
- flag = a[0];
- }
- if(flag == 1)
- {
- counter++;
- }
- i++;
- }
- cout << counter << endl;
- return 0;
- }
经过实验发现的确是2/3!其实这个问题有很多的变形,大家可以总结一下会很有趣!
阅读(3401) | 评论(11) | 转发(0) |