贡献者: Siegfried
三门问题,又叫蒙提霍尔问题(Monty Hall problem)其衍生过许多版本,写进过高中数学教科书思考题,在网上讨论也颇多,但目前看到的结论多数不赞同,或者是被限制了条件。下面来看一下这个悖论的原始版本:
Monty Hall 是美国一个电视游戏节目的主持人,你是参赛者。你面对三扇门 A, B, C (或者是 1 号,2 号,3 号),其中一扇门的后面是汽车,另外两扇门后面是山羊,你的目标是赢得汽车。你随机选择一扇门(假设你选择了 A),这时主持人打开了 C,C 后面是一只山羊,并给你一次重新选择的机会。现在汽车只可能在 A 和 B 中,你该不该换门,汽车在 A 和 B 后面的概率各是多少?
不同的人有不同的思考方式,主要集中在以下几种:
除了问题描述本身,还有一个关键之处:Monty Hall 打开另一扇门的动机。这个问题实际是一个缺少先验概率的条件概率问题。不妨我们给它补上:Monty Hall 在你选对的情况下打开另一扇门的概率是 $x$,在你选错的情况下打开另一扇门的概率是 $y$,这道题才能计算正确答案!现在我们来算一算,当 $x$, $y$ 符合什么情况该换门,什么情况不该换。
先考虑极端情况:
根据贝叶斯公式:
可见,不换门赢得汽车的概率,只与 $y$ 与 $x$ 的比例有关,下面是 $x$, $y$ 在[0,1]范围内的热度图像
所以暂时的结论是:
利用 random(伪)随机数,制造出随机的五组 $x$, $y$ 计算在每次都选 A 门,提供了换门机会,且不换门赢得汽车的理论概率,并模拟汽车真实在 A 门后面几率
import random
random.seed(0)
def monty_hall_problem(max_trial, x, y):
done = False
total_car_in_A = 0
total_trial = 0
#Monty Hall 问题大量发生,每一次都选A且不换门
while not done:
#用1,2,3表示汽车在A,B,C
car_behind_door = random.randint(1,3)
if car_behind_door == 1:
#有x概率开另一扇门,此时不换会赢得汽车
if random.random() < x:
total_car_in_A += 1
total_trial += 1
#否则不开门,不符合假设
else:
continue
#有y概率开另一扇门,此时不换赢不到
elif random.random() < y:
total_trial += 1
#同样,不符合假设
else:
continue
if total_trial >= max_trial:
done = True
return total_car_in_A / total_trial
if __name__ == "__main__":
for i in range(5):
#随机选5组随机数
x = random.random()
y = random.random()
#理论值
p0 = x /(x + 2 * y)
#实际值
p = monty_hall_problem(10**6, x, y)
print("第{0}次随机x = {1:.2%}, y = {2:.2%},理论概率 x/(x + 2y):{3:.2%}"
.format(i+1, x, y, p0))
print(" 百万数量模拟下,汽车在A门后的几率为:{0:.2%},相对误差为{1:.2%}"
.format(i+1, p, (p - p0)/ p0))
上述代码执行后的结果如下:
第1次随机x = 84.44%, y = 75.80%,理论概率 x/(x + 2y):35.78%
百万数量模拟下,汽车在A门后的几率为:35.71%,相对误差为-0.17%
第2次随机x = 76.87%, y = 1.68%,理论概率 x/(x + 2y):95.82%
百万数量模拟下,汽车在A门后的几率为:95.82%,相对误差为0.01%
第3次随机x = 35.97%, y = 80.81%,理论概率 x/(x + 2y):18.20%
百万数量模拟下,汽车在A门后的几率为:18.17%,相对误差为-0.21%
第4次随机x = 80.72%, y = 63.39%,理论概率 x/(x + 2y):38.90%
百万数量模拟下,汽车在A门后的几率为:38.94%,相对误差为0.09%
第5次随机x = 19.08%, y = 86.08%,理论概率 x/(x + 2y):9.98%
百万数量模拟下,汽车在A门后的几率为:10.01%,相对误差为0.31%
看到这里,你根据节目历史,估算出了 $x$,$y$,之后通过计算比较了换与不换的概率的大小,去参加节目,是否必有超过一半概率赢回汽车?
答案:当然不是!因为这是一个条件概率问题,你不能保证你去参加节目一定会达成条件。很可能你第一次选错直接 GAME OVER 了。
既然这样计算上面概率还有什么意义呢?我们已经得出这个结论了不是:如果 Monty Hall 打开另一扇门,给我们一次换门的机会,$x>2y$ 时选择不换,否则选择换。所以,还需一步就可以推导不含条件的全概率公式:
$$ \begin{aligned} &P(\text{赢得汽车})=\\ & \left\{\begin{aligned} &\frac{1}{3}(\overbrace{1-x}^{\text{1-$x$ 概率直接赢}}+\overbrace{x\cdot \frac{x}{x+2y}}^{\text{$x$ 概率开门,乘以不换门赢的概率}})+\frac{2}{3}(\overbrace{y\cdot \frac{x}{x+2y}}^{\text{$y$ 概率开门,乘以不换门赢的概率}}) && \text{ ①}\\ & \qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad \text{if } x\ge2y \ \ \text{(给机会也不换)}\\ &\frac{1}{3}[1-x+\underbrace{x\cdot(1- \frac{x}{x+2y}}_{\text{这里替换成换门赢的概率,其他同上}})]+\frac{2}{3}[y\cdot(1- \frac{x}{x+2y})]& \text{ ②}\\ & \qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad \text{if } x<2y \ \ \text{(给机会就换)}~. \end{aligned}\right. \end{aligned} $$
化简①式,结果为:1/3, 化简②式,结果为:$(1+2y-x)/3$。
下面是全概率下的热度图像
这个结果是符合常理的,仅当 $x=0$,$y=1$ 情况,参赛者必赢(要么第一次选对直接赢得汽车,要么第一次选错 100%开门,第二次换门赢得汽车),其他情况下,根据不同的 $x$, $y$,赢得汽车的概率在 1/3 和 1 之间
如果你是参赛者,并且希望赢走汽车,为了提高成功率一定要提前知道 Monty Hall 的策略(根据节目历史估算 $x$, $y$)
如果你不知道该不该参加节目,可以通过 汽车价格 × 上面的概率 计算 期望值,如果期望值大于入场门票价格,那么,大量参加节目是稳赚不赔的(当然在 Monty Hall 不会针对你多次参加竞猜而改变策略前提下)。事实上,2005 年 2 月,美国的某一个彩票品种由于设计不周,真的出现过稳赚不赔的情况,被麻省理工一名学生发现并通过反复购买赚到了 300 万美元。链接
那么转换思维,如果你是 Monty Hall 呢,你当然不希望参赛者轻松的赢走门后的汽车,应该怎么做?
短期做法:
长期做法:
本文完,原创文章,作者最早曾发布于个人博客并于 2023 年加入小时百科创作,如需转载,请注明来源。