车与羊的选择

电影《决胜21点》开始部分,课堂上教授问了这样一个问题:
假设你正在参加一个电视游戏节目,被要求在三扇门中选择一扇。其中一扇后面有一辆车,其余两扇后面则是羊。你选择了一扇门,假设是1号门。这时候不知什么原因,主持人——他知道各个门后面都有什么——却开启了另一扇门,假设是3号门,后面是羊。然后他问你:“现在给你一个改变主意的机会,你想换成2号门吗?”

剧中的学霸男主立刻回答:“当然应该换,原来选一号门时有1/3的概率得到车,换的话则会有2/3的概率。”教授说:“Exactly!” 。


看到这我不禁吃了一惊 ,这个答案有点反常识么,我的想法是:因为3号门已经被排除,剩下两扇门有车的概率是一半对一半,换不换应该无所谓才对。

究竟电影是在戏说,还是我的直觉错了,毕竟当初没有好好学过概率论,遇到这种问题总是犯迷糊,不过所谓实践出真知,我们也许可以实际测试一下,当然不可能在真实世界进行测试,还是用程序来仿真吧:


设有一个长度为3的布尔数组,每个元素代表1扇门,元素下标代表门的序号。元素值为真表示门后为车,值为假表示门后为羊。
创建两个线程分别代表主持人和玩家,主持人线程的流程为:
1)开始,随机设定某一数组元素为真,其余为假。然后唤醒玩家线程
2)将自己挂起
3)(在玩家选择了一个元素后被唤醒),从剩下的两个元素中选出一个为假的元素,记下其序号(表示排除这扇门)。然后唤醒玩家线程
4)将自己挂起
5)被唤醒后回到1)
玩家线程的流程为:
1)开始,将自己挂起
2)(在主持人设定数组后被唤醒),随机选择一个元素,记下其序号。然后唤醒主持人线程
3)将自己挂起
4)(在主持人标记一个为假的元素后被唤醒),如果不需要换门,则保持自己在2)中选择的原序号不变。如果需要换门,则更新序号,使新序号既不等于原序号,也不等于主持人在3)中排除的序号。然后检查选中序号所指元素的值,如为真则表示命中了车,为假表示命中了羊。然后唤醒主持人线程

5)回到第一步


另外,我用两个外部参数分别控制游戏进行的次数和玩家线程在4)中是否需要换门。设游戏次数为一千次,按不换门和换门分别进行测试,输出到控制台的结果大致是这样:

>>>>>>
$ java tmp.SheepOrCar


Test01: 1000 times without change
Result: Total(1000)Cars(318)Rate(%31)


Test02: 1000 times with change
Result: Total(1000)Cars(682)Rate(%68)
<<<<<<

在各1000次游戏中,坚持不换门的命中汽车318次,命中率31%,换门的命中682次,命中率68%,似乎已足以说明问题了。所以学霸毕竟是学霸,而我的直觉是靠不住的。
我的测试代码在:
https://github.com/sunxiaoou/TIJ4/blob/master/tmp/SheepOrCar.java

你可能感兴趣的:(车与羊的选择)