三扇门里藏着一辆汽车,你选一扇,主持人再打开一扇露出山羊。只剩两扇门,胜率就各半了吗?1975年,统计学家Selvin把这个问题写进期刊;1990年,vos Savant建议换门,又引发争论。答案藏在主持人的规则里:我们用十万局模拟说明换门为何能赢三分之二,也追问规则改变后,答案为何随之改变。

从期刊来信到专栏争论
1975年2月,Steve Selvin在《The American Statistician》发表来信《A Problem in Probability》。在同年8月的后续来信中,他回应了质疑,并明确说明:主持人知道奖品在哪里;如果有两个空盒可开,就随机选择一个。本文读到的是这封后续来信的第三方摘录,尚未比对两封来信的出版商扫描件。Selvin来信摘录
1990年,这个问题进入更广泛的公共讨论。Richard D. Gill的研究论文记载,9月9日,Marilyn vos Savant在《Parade》的“Ask Marilyn”栏目回答读者Craig Whitaker:应该换门。她的回答引发了争论。这里的日期及栏目信息据Gill转引,未声称核对过当期原刊。Gill论文
争论的一部分来自直觉:既然剩下两扇门,就该一半对一半。另一部分则来自建模:题目究竟承诺主持人做什么?数学题借用了蒙提霍尔的名字,但计算的规则需要单独说明,不能直接当成电视节目真实流程。
换门赢在最初选错的两次
先固定规则:汽车等概率藏在三扇门之一;你的初选与藏车位置独立;主持人知道车的位置,总会从你没选的门中打开一扇羊门,并总给你换到另一扇关闭门的机会。
假设你先选1号门,三种藏车位置就足以把结果说清楚:
| 汽车位置 | 初选结果 | 坚持 | 换门 |
|---|---|---|---|
| 1号门 | 选中车 | 赢 | 输 |
| 2号门 | 选中羊 | 输 | 赢 |
| 3号门 | 选中羊 | 输 | 赢 |
每行概率都是1/3。初选中车时,换门会失去车;初选中羊时,主持人必须避开车,留下的另一扇关闭门就是车。因此,始终换门的总体胜率是2/3,坚持则是1/3。
这个总体结论不要求主持人在两扇羊门之间等概率选择。可是,“始终换门能赢多少局”与“已经看到主持人打开3号门,此刻换门的胜率是多少”是两个问题。后者还会用到主持人偏好开哪扇门的信息。Gill论文,第2.1节
主持人的规则改变后验
固定初选1号门,观察到主持人打开3号门、露出山羊。贝叶斯计算要问的是:假如车在不同位置,这个观察各有多容易发生?
仍假设主持人知情、总开羊门并总允许换门。设q为车在1号门时,主持人选择开3号门的概率。车分别在1、2、3号门时,观察到开3号羊门的概率依次是q、1、0。乘上相同的先验概率1/3,再归一化,得到:
P(车在2号门|初选1、开3号羊门)=1/(1+q)。
如果主持人可选时抛公平硬币,q=1/2,换门胜率就是2/3;如果他可选时总开3号门,q=1,此刻两扇门各有1/2;如果他可选时从不开3号门,q=0,那么看到他开3号门,就能确定车在2号门。这些条件概率的变化不推翻上一节的总体胜率。Gill论文中的似然与后验赔率推导
再换一种机制:主持人不知道车在哪,随机打开你没选的一扇门,只保留恰好开出羊的局。初选中车且开羊的概率是1/3;初选中羊且开出另一只羊的概率是(2/3)×(1/2)=1/3。在保留下来的局里,两类各占一半,换与不换胜率都是1/2。这里的分母是保留局数,不能与上一节的全部局数混用。
还可以构造更极端的反例:主持人只在你初选中车时邀请换门。收到邀请本身就透露了信息,此时换门必输。这是为说明规则作用而设的假想机制。若主持人类型未知,就需要为各种类型指定先验,并计算观察在各类型下的似然;“不知道”本身不能自动替代这些设定。
十万局模拟中的胜率收敛
按知情主持人的标准规则,使用Python实际运行100,000局,随机种子为20261019。每局同时记录坚持和换门的结果:坚持获胜33,404局,胜率33.404%;换门获胜66,596局,胜率66.596%。程序逐局确认两种策略恰有一个获胜。
下面是可复现的模拟核心;横轴取累计局数,分别画出两列累计胜率,就得到收敛图的数据。
import random
rng = random.Random(20261019)
n = 100_000
stay = switch = 0
rows = []
for k in range(1, n + 1):
car = rng.randrange(3)
pick = rng.randrange(3)
opened = rng.choice([
d for d in range(3)
if d != pick and d != car
])
other = next(
d for d in range(3)
if d != pick and d != opened
)
a = int(pick == car)
b = int(other == car)
assert a + b == 1
stay += a
switch += b
rows.append((k, stay / k, switch / k))
print(stay, switch)
前几局可能出现很大的偏离,累计局数增加后,曲线逐渐靠近1/3和2/3。模拟展示的是这些设定下的长期频率;理论概率来自规则与推导,模拟也不能证明现实主持人遵守同样规则。面对只剩两个选项的情境,值得先追问的,是另一个选项如何被排除。
