三门问题浅析
三门问题曾出现在我遇到过的一次笔试题中,也困扰了我很长一段时间。翻看了一些博客,现进行一下总结,供以后查阅。
0. Introduction
三门问题——亦称为蒙提霍尔问题,出自美国的电视游戏节目Let's Make a Deal. 问题描述如下:
参赛者面前有三扇关闭着的门,其中只有一扇门的后面是汽车,另外两扇门后面则各藏有一只山羊,选中后面有车的那扇门就可以赢得该汽车。当参赛者选定了一扇门,但未开启时,主持人会开启剩下两扇门中的一扇,露出其中一只山羊(为参赛者排除一扇错误的门)。主持人其后会问参赛者要不要更换选择,选另一扇仍然关着的门。
问:参赛者是否应该选择换门?
注意:主持人必定打开藏有山羊的门。他知道哪扇门有奖品。他不会打开你选择的门。
据说此节目一经播出就引起了热烈的讨论,有人说应该换,有人认为换不换都一样。
观点一:换或者不换都一样,中奖几率都是50%。
解释:当参赛者选择一扇门时,他中奖的几率确实只有1/3。但当主持人帮忙排除掉一扇门时,车要么在参赛者所选的这个门中,要么在剩下的未被选择的那扇门中。此时参赛者二选一,无论是否变更选择,中奖几率都是1/2。
观点二:不换的中奖几率是1/3,换的话将有2/3的几率中奖,因此当然应该换。
解释:0号门,1号门,2号门(假设奖品在0号门后),如果选择不换门,即忽略主持人,中奖率是1/3。
如果选择换门,有如下三种情况:
结论:如果第一次选的是0,最后不中奖,如果第一次选的1或者2,最后必然中奖,即换门中奖概率为 2/3 。应该换门
1. 分析
这两种观点乍一看似乎都有道理,但实际上第一种观点是错误的。因为1/2这个概率只考虑了第二次选择,而忽略了第一次选择。
来看另外一个例子:
假设有2个参赛者A和B,参赛者A按照原来的流程先选择一扇门,此时主持人把一扇有山羊的门排除掉了。此时又来了一个参赛者B,他并不知道之前发生的事情,此时他在剩下的两扇门中随便选择一扇门。
问:参赛者A和B中奖的概率一样吗?
答案是不一样的。因为在整个过程中,A比B多掌握了一点信息。
A了解到的是:剩下的两扇门中被排除了一扇。于是站在A的角度,如果换门,中奖概率是(第一次没中第二次中了) \(\frac{2}{3}*1=\frac{2}{3}\)
而对B来说,他看到的是:三扇门中被排除了一扇。于是站在B的角度,只能在剩下的两扇门中二选一,中奖概率是\(\frac{1}{2}\)
正是因为掌握的信息是不对称的,因此A能够比B更加准确地做出判断,进而影响到决策的正确性。如果抽奖重复很多次,A每次都更换选择而B是随机选择,那么A将大约比B多 \(\frac{2}{3}-\frac{1}{2}=\frac{1}{6}\) 的中奖机会。
可以发现,这里的参赛者B其实就是上面观点一的另一种表述方式(忽略了第一次选择)。
简单来想,第一次就抽中汽车的概率为1/3,第一次抽中山羊的概率为2/3,而主持人一定会排除一扇错误的门,意味着只要第一次抽中山羊,选择换门必然会抽中汽车!
通过前面的分析,可以发现三门问题应该换门的前提是主持人知道门后是否有奖品,他一定会打开藏有山羊的门。(也即排除了一个错误答案,也使得样本数-1)
如果我们稍稍改变一下前提:
主持人事先也不知道汽车在哪个门后面,他只是随便打开两扇门中的一扇,并且恰好这扇门后面是山羊,那么此时的情况又是怎样呢?
在某一次特定的选择中,这两种情况并没有不同,但实际上两种前提隐含的样本数却是不同的。
假设这个节目在播出前录制了一万次。(这实际就变成了不放回抽样的问题。每次抽取,都有1/3的概率抽中汽车。)主持人有1/3的可能会选中汽车,这与节目的要求是不符的。因此最终只有大约6700次录制是有效的。
按照前面的分析,当选择0号门后,如果不换门,0号门中奖概率不再改变(\(\frac{1}{3}\)),但由于现在样本数变为了原来的\(\frac{2}{3}\),此时0号门的新的中奖几率将变为:\(\frac{1}{3}\div\frac{2}{3}=\frac{1}{2}\)
如果换门,仍然可以用之前的方法来分析,只是可能的情况由3种变成了6种:
6种情况的几率都是1/6,但是3和5两种情况是无效的(于是一共剩4种情况),如果换门,1/2的概率中奖。因此无论是否变更选择,都各有一半的几率会中奖。
2. n门问题
需注意,1 - 1/3 (不换的中奖率)= 2/3(换的中奖概率),只是特例。
若有10扇门,不换的中奖率是0.1, 换的中奖率不是0.9,而是 \(\frac{9}{10} * \frac{1}{8} = \frac{9}{80} = 0.1125\) (换且中奖等于第一次没选对加第二次选对)
总结: n门问题(前提:主持人只会开空门)
不换,中奖概率是\(\frac{1}{n}\),
换,中奖概率是 \(\frac{n-1}{n} * \frac{1}{n-2} = \frac{n-1}{n(n-2)}\)
换比不换中奖概率高 \(\frac{1}{n(n-2)}\)
3. 程序模拟
import random
def openNoPrizeOne(doors, myChoice):
while True:
hostChoice = random.randint(0,2)
if hostChoice!=myChoice and doors[hostChoice]!=True:
break
return hostChoice
def alterChoice(myChoice, hostChoice):
myChoice = (myChoice+1)%3 # 往后平移一个
if myChoice == hostChoice:
myChoice = (myChoice+1)%3 # 如果等于主持人的选择,再往后平移一个
return myChoice
totalTimes = 1000000
bingo = 0
doors = []
for i in range(totalTimes):
doors = [False, False, False]
doors[random.randint(0,2)] = True # 随机选一扇门后面放奖品
myChoice = random.randint(0,2) # 参赛者随机选一扇门
hostChoice = openNoPrizeOne(doors, myChoice)
myNewChoice = alterChoice(myChoice, hostChoice) # 参赛者更换选择
if doors[myNewChoice]:
bingo+=1
# 更换选择的中奖率
print("中奖率: {:.2f}%".format((bingo/totalTimes) * 100))
运行结果:
Ref
https://www.cnblogs.com/antineutrino/p/4821580.html
https://www.cnblogs.com/funwithwords/p/15644270.html
https://blog.csdn.net/IMWTJ123/article/details/79979120