三门问题是一个经常在各大论坛里出现的问题。对于大众来说,三门问题可以说是最具有富有争议性的数学问题之一。三门问题具体表述如下:
有一个电视游戏竞猜节目,主持向挑战者(也就是你)展示了三扇门。有一扇门之后是一辆小轿车,另两扇门之后是空房间。主持人事先知道门后是什么。
游戏分为三步:首先,你选择一扇门;然后,主持人将会打开剩余的两扇门中的一扇,展示一个空的房间(当然他从未打开那扇后面藏有轿车的门);最后,你可以选择是仍然选择你开始选择的那扇门,还是选择去打开另一扇仍然关闭的门。 如果你选择换门,则你获得小轿车的概率是多少?
咋一看,貌似这道题的答案是二分之一。因为不管你选择哪扇门,主持人都会一边向你坏笑一边打开一扇空门,主持人打开空门这个动作看起来是多余的。
但是答案是:选择换门是更好的策略。理论证明可以见我的这篇文章:武辰:[终结数学月经题系列2]三门问题zhuanlan.zhihu.com
如果你不想看理论证明,或者不认同我的答案,或者看完理论解释后仍然云里雾里,怎么办?亲自用程序模拟一遍或许对你有帮助。
在下文,我给出了我的编程模拟的过程。我的代码是用Python写的,关键的地方都加了注释。
import random
buhuan=0 #不换
huan=0 #换
for i in range(10000): #这意味着我们要做1000次实验
car = random.choice([1,2,3]) #汽车随机出现在三扇门之中
challenger = random.choice([1,2,3]) #挑战者随机选择了一扇门
#以下五行代码:主持人随机选择一扇门,这扇门不是挑战者选择的门,也不是汽车所在的门
host_list = [1,2,3]
host_list.remove(challenger)
if car in host_list:
host_list.remove(car)
host = random.choice(host_list)
if challenger == car:
buhuan = buhuan+1 #如果挑战者一开始选的门背后有汽车,那么不换是对的
else:
huan = huan+1 #如果挑战者一开始选的门背后没有汽车,那么换是对的
print(buhuan)
print(huan)
代码运行的结果是:换门相比于不换门,获奖的次数多了一倍!
开个脑洞,把题目稍微做变动:主持人事先不知道车在哪个门后面。如果主持人在第二步打开的门刚好是有汽车的门,那么游戏重来。在这种情况下,换门与不换门孰优孰劣?
import random
buhuan=0
huan=0
for i in range(1000):#这意味着我们要做1000次实验
car = random.choice([1,2,3])#汽车随机出现在三扇门之中
challenger = random.choice([1,2,3])#挑战者随机选择了一扇门
#以下三行代码:主持人随机选择一扇门,这扇门不是挑战者选择的门
host_list = [1,2,3]
host_list.remove(challenger)
host = random.choice(host_list)
if host == car:
continue #如果主持人在第二步选的门是汽车,则重来
if challenger == car:
buhuan = buhuan+1
else:
huan = huan+1
print(buhuan)
print(huan)
代码运行的结果是:换门与不换门的效果是一样的。
那么问题又来了,假如我不知道主持人事先是否知道车在哪扇门后面,那么挑战者应该换门吗?
这个问题只能定性分析,而无法定量分析。答案当然是应该换门。因为不论主持人事先是否知道车在哪扇门后面,换门都至少不比不换门差。但是我不知道换门后获得汽车的具体概率,而且我认为没有人能够求出这个概率,如果大家都是忠实的频率学派的拥护者的话。事实上并不是所有的事情都是有概率可言的。所以如果要精确求概率的话,这个问题就变得无意义了。
如果有机会的话,我会陆续更新其他具有争议性的数学问题的代码实现。编程对于解决数学问题,尤其是概率论方面的问题,真是如虎添翼。程序模拟虽然不能严格证明一个数学结论,但是可以启发思维,指引着思路往正确的方向走。当然它还有个小的好处,就是可以迅速结束论坛里或者各种群里关于三门问题的无休止的争论……