三门问题——亦称为蒙提霍尔问题,出自美国的电视游戏节目Let's Make a Deal。问题的名字来自该节目的主持人蒙提·霍尔(Monty Hall)[2]。问题是这样的:dom
参赛者面前有三扇关闭着的门,其中一扇的后面是一辆汽车,选中后面有车的那扇门就能够赢得该汽车,
而另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,主持人会开启剩
下两扇门中的一扇,露出其中一只山羊。主持人其后会问参赛者要不要更换选择,选另外一扇仍然关着的门。
听说此节目一经播出就引发了一场热烈的讨论,有人说应该换,有人认为换不换都同样。主持人给出的答案是应该换,并在下一期的节目中给出了一个分析表格用来讲明她的理由。但这下反对的声音更大了,在几千封来信中,反对者达到了9成。[1]oop
在全部认为该换和不应换的争论中,正反两方造成了两种对立的观点。post
一种是认为不换的中奖概率是1/3,换的话将有2/3的概率中奖,所以固然应该换。由于:spa
根据参赛者的选择,一共有下面三种可能状况(两只山羊分别称为山羊A和山羊B):3d
(1) 参赛者选择山羊A,主持人选择山羊B; (2) 参赛者选择山羊B,主持人选择山羊A; (3) 参赛者选择了汽车,主持人选择两只山羊的任何一只
三种状况概率各为1/3,若是换的话,前两种都会中奖,仅第三种不会中奖。因此选择换的中奖几率为2/3,不换概率只有1/3。code
下面再来看看“反方”观点,这种观点认为换不换都同样,概率都是50%。由于:htm
当参赛者选择一扇门时,他中奖的概率确实只有1/3。但当主持人帮忙排除掉一只山羊时,
车要么在参赛者所选的这个门中,要么在剩下的未被选择的那扇门中。此时参赛者变动选
择的话,固然中奖概率会提高到1/2。
还能够换一个角度来理解。即便他没有变动选择,他实际上也作出了选择,只是选择的是“不变动”而已。虽然选择的是“不变”,但不表明他的概率不变。整个过程从新组织一下会更容易看明白:blog
(1) 参赛者选了一扇门但不打开 (2) 此时主持人在剩下的两扇门中选出一扇后面是山羊的门 (3) 而后参赛者在剩下的两扇门中再次选择了第一次选择的门
因此,他选到车的几率为50%。游戏
固然,还有不少“非主流”的观点,但都经不起推敲,这里再也不赘述,感兴趣的能够去搜一下。事件
两种观点乍一看好像都颇有道理,但它们之中确定有一个是错误的。我认为第一种是正确的,所以分析的重点是解释为何另外一种答案是错误的。而且后面我会编写程序来验证答案。
为何第二种观点是错误的呢?这是由于当咱们第一次作出选择时,所基于的样本总数为3,此时选定的门后面为汽车的概率是1/3。而且选定后这一概率不会再改变(第二种答案正是基于概率会变的观点),由于对于已发生的事件来讲,后来发生的事件是不可能影响它的概率的。
千万不要误解了上面这句话,这里谈到的是概率,是屡次事件的统计结果,并非肯定的一次已发生事件的结果。例如,当把剩下的两个门都打开后,就可以肯定第一扇门后面是否为汽车,但第一扇门的“概率”会所以而改变吗?不会,由于此时咱们在谈的是特定一次的结果,而不是概率。若是咱们将此过程重复不少次,每次选择一扇门以后都经过另外2扇门来判断这扇门后面是否是汽车,咱们会发现,此时获得的概率仍然为1/3。
第二种答案之因此是错的,还在于它搞错了一件事情,当咱们说“当咱们作出选择时,概率就随之肯定了”这句话时,其实是在说“三扇门中任何一扇门后面是汽车的概率都是1/3”,而不是“咱们的选择决定了这件事的概率”。我想不少人都搞错了这一点,一件事的发生概率是由事物的本质规律决定的,并不会因咱们人类的意志为转移。
因此第一次选择某个门时,此时的概率是肯定的1/3,当主持人排除掉一扇门以后,第一扇门的概率毫不会所以而改变,必然仍然是1/3。也许你还有点绕不过这个弯,为此咱们来作一个思惟实验:
假设你是参赛者,台上放着三个盒子,其中一个盒子中有奖品,另外两个是空的。
你首先从三个盒子中随便选择一个,而后把所选的盒子抱到一间密封的屋子里面,
但不容许打开盒子,此时主持人在剩下的两个盒子中打开没有奖品的那个。试问,
你怀里的盒子的中奖概率会所以而改变吗?
是否是有点“薛定谔的猫”的味道?薛定谔的猫是针对量子态的,其真相咱们还不得而知,但对宏观世界来讲,我能够负责任地说,盒子中奖的概率绝对不会改变。
可能你如今已经可以接受第一次选择的盒子的中奖概率不会改变这一结论了。但我知道你确定还有最后一个疑问,若是不把这个疑问弄清楚,你永远也不可能真正弄明白这个问题。为此,咱们来进行第二个思惟实验:
假设有2个参赛者A和B,参赛者A按照原来的流程先选择一扇门,此时主持人把一
扇有山羊的门排除掉了。此时又来了一个参赛者B,他并不知道以前发生的事情,
此时他在剩下的两扇门中随便选择一扇门,他的中奖概率不该该是1/2吗?也就是
说,剩下的两扇门的概率不该该都是1/2吗?
可能你已经看出来了,这实际上就是对第二种观点的另外一种表述方式,只是把参赛者表述成了A和B 2我的。一样的2扇门,A和B看到的概率却不同,这可能吗?
前面说过,概率其实是事物的固有规律,并不以咱们的意志为转移。或者说,世间本没有“概率”这个东西,每一件事情都是孤立的、肯定的(这里仅讨论宏观),概率只是通过咱们人类的抽象和总结后获得的一个概念。每一次,当三扇门被放到台上时,它的结果都是肯定的,并且任何2次相互之间都不会有任何影响。这就像抛硬币同样,虽然你可能已经连续抛了100次正面,但你仍然没法确定下一次是正面仍是反面。
回到参赛者A和B的问题上来。他们俩到底哪个是正确的呢?
答案是2人都对。
但一扇门的概率怎么可能便是1/3又是1/2呢?这是由于在整个过程当中,A比B多掌握了一点信息,A了解到的是:
剩下的2扇门中被排除了一扇
而对B来讲,他看到的是:
三扇门中被排除了一扇
正是由于掌握的信息是不对称的,所以A可以比B更加准确地作出判断,进而影响到决策的正确性。也就是说,A“更加正确”,B虽然也没有错(题目给他的信息只有那么多,他只能得出对他来讲最为正确的判断),但他却比A要稍逊一筹。若是抽奖重复不少次,A每次都更换选择而B是随机选择,那么A将大约比B多2/3-1/2=1/6的中奖机会。更有甚者,若是A每次都更换选择,而B是一个认死理的人,他每次都非要跟A反着干,那么结果将会更惨。
若是说了这么多你内心还保留着一点点疑惑的话,那我再来讲一个思惟实验,这个思惟实验是个人“终极武器”,每次跟人讨论这个问题的时候,只要一说出这个实验,争论立马就平息了。这个实验是这样的:
假设你买了一张彩票,此时上帝出现了,祂对你说,小伙子,看到你买了这么屡次
连一次5块的都没中过,此次我决定为你排除掉一半不能中奖的号码。 那么请问,在上帝帮你排除掉那些号码后,你手里这张彩票的中奖概率会所以而变
大吗?若是此时让你再买一张,你的中奖概率会变大吗?
我想答案是不言而喻的。
下面咱们用程序来模拟一下,看看究竟是怎样的。
int totalTimes = 1000000; int bingo = 0; boolean[] boxes; for (int i = 0; i < totalTimes; i++) { // loop 1 million times boxes = new boolean[] {false, false, false}; boxes[random(3)] = true; int myChoice = random(3); int hostChoice = openNoPrizeOne(boxes, myChoice); // 判断另外一个盒子是否中奖等同于判断开始选的盒子没有中奖 if (!boxes[myChoice]) { bingo++; } } // 更换选择的中奖概率 double ratio = (double) bingo * 100 / totalTimes; System.out.println("主持人帮忙排除一个山羊:" + ratio + "%"); return ratio;
其中,random()方法用来生成一个小于参数的随机非负整数。openNoPrizeOne()用来在剩下的门中排除掉一个山羊。
运行这段程序,能够发现最后的结果确实在2/3附近,例以下面是某次运行的结果:
下面再来看看上面第二个思惟实验中,参赛者A和参赛者B的概率各是多少:
int totalTimes = 1000000; int bingoA = 0; int bingoB = 0; boolean[] boxes; for (int i = 0; i < totalTimes; i++) { // loop 1 million times boxes = new boolean[] {false, false, false}; boxes[random(3)] = true; int aChoice = random(3); int hostChoice = openNoPrizeOne(boxes, aChoice); // 判断另外一个盒子是否中奖等同于判断开始选的盒子没有中奖 if (!boxes[aChoice]) { bingoA++; } // 参赛者B各有1/2的概率选择A所选的和剩下的那扇门 boolean isChoiceSameAsA = (random(2) == 1); if (isChoiceSameAsA && boxes[aChoice] || !isChoiceSameAsA && !boxes[aChoice]) { bingoB++; } } // 更换选择后A的中奖概率 double ratioA = (double) bingoA * 100 / totalTimes; // 随机作出选择的B的中奖概率 double ratioB = (double) bingoB * 100 / totalTimes; System.out.println("主持人帮忙排除一个山羊,参赛者A:" + ratioA + "%,参赛者B:" + ratioB + "%"); return new double[] {ratioA, ratioB};
下面是某次运行结果:
从代码中咱们能够明显地看出(参考判断B是否中奖的if语句):对参赛者B来讲,并非剩下的两扇门的中奖概率都为1/2,而是当咱们在两扇门中随机选择一扇时的总中奖概率为1/2。也就是说,B的随机选择“调匀”了两扇门的概率,实际上此时他的中奖概率为:
1/2 * 1/3 + 1/2 * 2/3
完整代码
http://pan.baidu.com/s/1jGyBXjg
参考资料