Chinaunix首页 | 论坛 | 博客
  • 博客访问: 613891
  • 博文数量: 79
  • 博客积分: 848
  • 博客等级: 军士长
  • 技术积分: 1800
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-26 19:30
文章分类

全部博文(79)

文章存档

2015年(4)

2013年(39)

2012年(36)

分类: C/C++

2012-10-24 12:42:52

昨天大家吃饭的时候的,聊起今年面试的时候出的一个问题,在原理上跟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!
为了证明我们的说法我们可以写一个程序模拟一下这个场景:

点击(此处)折叠或打开

  1. #include<iostream>
  2. #include<ctime>
  3. #include<cstdlib>
  4. using namespace std;
  5. int main()
  6. {
  7.     int counter = 0;
  8.     int flag;
  9.     int j;
  10.     int s;
  11.     int i = 1;
  12.     int a[3];             //代表三扇门
  13.     srand(time(0));
  14.     a[0] = 1;             //有汽车的门
  15.     a[1] = 0;
  16.     a[2] = 0;
  17.     while(i <= 1000000)
  18.     {
  19.         j = rand()%3;     //观众随机选择了一扇门
  20. /*主持人首先判断观众选择的这扇门中是不是有车,假如有车他会从剩下的两扇中随机的打开一扇门,假如观众选择的门后没有车他会打开另外一扇没有车的门。按照这个逻辑我们将s当作主持人的选择,然后将剩下的一扇门中的结果给flag,判断一下flag=1的次数,就是观众改变自己的选择选中车的概率*/
  21.         if(j == 0)
  22.         {
  23.             s = rand()%2 + 1;
  24.             if(s == 1)   
  25.             {
  26.                 flag = a[2];
  27.             }
  28.             else
  29.             {
  30.                 flag = a[1];
  31.             }
  32.         }
  33.         else if(j == 1)
  34.         {
  35.             flag = a[0];
  36.         }
  37.         else if(j == 2)
  38.         {
  39.             flag = a[0];
  40.         }
  41.         if(flag == 1)
  42.         {
  43.             counter++;
  44.         }
  45.         i++;
  46.     }
  47.     cout << counter << endl;
  48.     return 0;
  49. }
经过实验发现的确是2/3!其实这个问题有很多的变形,大家可以总结一下会很有趣!

阅读(3297) | 评论(11) | 转发(0) |
给主人留下些什么吧!~~

风箫夜吟2013-04-15 09:55:22

风箫夜吟:386727871

其实上面的就是一个
c语言的代码,你按照这个改成c语言代码就行了!

回复 | 举报

风箫夜吟2013-04-15 09:53:09

632051132:好吧  我还是不懂换门后的2/3的原因

386727871

回复 | 举报

6320511322013-04-14 22:47:56

632051132:我想加下你QQ啊  谢谢了

好吧  我还是不懂换门后的2/3的原因

回复 | 举报

6320511322013-04-14 21:41:33

风箫夜吟:因为第一次在你选择之前,门后有两只羊一辆汽车呀?你选中羊的概率当然是2/3啦

我想加下你QQ啊  谢谢了

回复 | 举报

6320511322013-04-14 21:41:15

风箫夜吟:因为第一次在你选择之前,门后有两只羊一辆汽车呀?你选中羊的概率当然是2/3啦

我想加下你QQ啊 谢谢了

回复 | 举报