Featured image of post 贝叶斯、1000次模拟:彻底搞懂三门问题

贝叶斯、1000次模拟:彻底搞懂三门问题

著名的蒙提霍尔问题

作者: Liquid Stack

文章来源: https://hehuang.site/p/monty-hall-probability-simulation/

这是个很出名的问题:

假设你正在参加一个游戏节目,你被要求在三扇门中选择一扇:其中一扇后面有一辆车;其余两扇后面则是山羊。你选择了一道门,假设是一号门,然后知道门后面有什么的主持人,开启了另一扇后面有山羊的门,假设是三号门。他然后问你:

“你想选择二号门吗?”

转换你的选择对你来说是一种优势吗?

从直觉上来看,几乎所有人都会觉得最后都是 $1/2$ 的概率,没有区别,实则不然。

正好我们数学学到全概率和贝叶斯那块的时候,我们数学老师出的这个问题,用全概率和贝叶斯来解答。

用概率解决问题

  1. 设事件 A = 汽车在 1 号门,事件 B = 汽车在 2 号门,事件 C = 汽车在 3 号门,则:

$$ P(A)=P(B)=P(C)=\frac{1}{3} $$

  1. 设事件 D = 主持人打开了 2 号门。

  2. 事件 D 的全概率:

$$ P(D)=P(D|A)P(A)+P(D|B)P(B)+P(D|C)P(C) $$

$$ =\frac{1}{2}\cdot\frac{1}{3}+0+\frac{1}{3} =\frac{1}{2} $$

  1. 贝叶斯:

$$ P(A|D)=\frac{P(D|A)P(A)}{P(D)} =\frac{1}{3} $$

$$ P(C|D)=\frac{P(D|C)P(C)}{P(D)} =\frac{2}{3} $$

  1. 结论:
  • 不换:$1/3$ 概率
  • 换:$2/3$ 概率

用频率估计概率

虽然用全概率和贝叶斯推导出了换门的概率更大,但感觉还是有些反常识。

接下来模拟 1000 次来看一下实际情况,用频率来估计概率。

用 Python 编写一个小程序:

第一步:定义 values=[0,0,1]

第二步:随机在三个门中选择一个作为初始选择。

第三步:主持人打开剩余门中的一个山羊门。

第四步:记录坚持选择和转换选择的结果。

第五步:重复 1000 次,然后计算两种策略的胜率。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import random

q_results = []
v_results = []

for i in range(1000):

    # 定义三个门,其中1代表汽车,0代表山羊
    values = [0, 0, 1]
    random.shuffle(values)

    containers = {
        "A": values[0],
        "B": values[1],
        "C": values[2]
    }

    # 随机选择一扇门
    Q_name = random.choice(["A", "B", "C"])
    Q_value = containers[Q_name]

    # 找到剩余的两个门
    remaining = {}

    for name, val in containers.items():
        if name != Q_name:
            remaining[name] = val

    remaining_names = list(remaining.keys())

    # 主持人打开一扇山羊门
    zero_containers = []

    for name in remaining_names:
        if remaining[name] == 0:
            zero_containers.append(name)

    N_name = random.choice(zero_containers)

    # 剩下的门就是转换后的选择
    for name in remaining_names:
        if name != N_name:
            V_value = remaining[name]

    # 记录结果
    q_results.append(Q_value)
    v_results.append(V_value)

    Q_total = sum(q_results)
    V_total = sum(v_results)

    print(f"坚持选择赢了 {Q_total} 次,转换选择赢了 {V_total} 次")

输出结果:

选择策略 命中概率 (理论值) 模拟命中次数 (n=1000) 实际概率
坚持初始选择 (Q) $1/3 \approx 33.3%$ 317 31.7 %
转换选择 (V) $2/3 \approx 66.7%$ 683 68.3 %

为什么会有直觉上的错误

我们主要忽视了一点:

主持人并不是随机开门,而是知道答案后主动排除错误选项。

当你选定一扇门后,你手里的概率只有:

$$ \frac{1}{3} $$

而剩余两扇门整体拥有:

$$ \frac{2}{3} $$

的概率。

主持人帮你剔除掉剩下的门中那个错误的,相当于把原本属于剩余两扇门的 $2/3$ 概率集中到了最后那一扇门上。

所以,换门本质上是:

用自己手里的 $1/3$,换取剩余区域中的 $2/3$。

这个其实很不好理解,大部分网上博主也是这种讲述方法。

相比之下,用贝叶斯公式进行计算,会更加严谨。


翻车现场

这个问题毕竟只是概率问题。

当模拟次数少的时候,结果有时候很难体现理论概率。

我们数学老师还做了一个现场版的演示:

他事先准备了三个小盒子,里面分别装着 1 毛硬币、1 毛硬币、5 毛硬币。

然后我们选择一个盒子,再决定是否交换。

结果最后没有换,反而中奖了……

这也说明了:

概率描述的是长期规律,而一次实验的结果仍然具有随机性。

采用 CC BY-NC-SA 4.0 协议许可