蒙提霍尔问题

2022.3.10 update.见文章末。

题面

这其实是一个广为人知的问题。假设有这么个游戏,主持人拿了三个盒子,其中有一个有奖,另外两个是空的。你有两次选择机会,在第一次选择后,主持人没有告诉你你选的盒子有没有奖,而是打开了另外两个盒子中的一个,并且告诉你这个盒子没奖。现在轮到你选第二次,你是换盒子还是不换呢?

一般来说有两种回答,第一种观点认为,现在剩下的两个盒子一个有奖一个没奖,概率当然是 12 ,换不换都一样。另一种结论则是,目前选择的盒子有奖的概率为 13 ,没奖概率是 23 ,当然是换嘛。

在高中学习过条件概率的 hmj 立刻觉得第二种观点有问题!明明都已经告诉一个盒子是空的了,这条件概率能一点不变?然而概统老师无情地告诉我们,第二种观点是对的。于是 hmj 苦思冥想了半节概统课,最终直到晚课通核摸鱼时才有点眉目。

这到底是怎么会事呢?

既然高中贫乏的概率论知识不管用了,我们还是使用严谨的式子先来表示下问题。

我们给盒子编号为 1、2、3,并且假设我们选的是 1 号:

A=B=1C=P(A|C)=P((AB)|C)+P((AB¯)|C)=P((A|B)|C)P(B|C)+P((A|B¯)|C)P(B¯|C)=1P(B|C)+0P(B¯|C)=P(B|C)

:P(A|C)=P((AB)|C)+P((AB¯)|C)=P(B¯|C)

可以看到两个值都取决于条件概率 P(B|C) 。而这个概率又和我们的 C 事件有关,我们就从不同的 C 的表述来讨论一下。

  • i

从最直觉的方面来想,主持人告诉了我们一个盒子为空,不妨假设为 2 号盒子,此时 C=2,于是有:

P(BC)=13P(C)=23P(B|C)=12

于是乎,我们得到了得到结论一……没办法,我们只能认为这个假设 C 有点问题。怎么设置新的事件 C 呢?在某乎查到的一个观点给了我一些头绪,这个观点认为,如果主持人随机在另外两个盒子中开了一个,刚好是空的,那么结论一就是正确的。而如果主持人知道哪个盒子是空的,只打开这个,那么就是结论二正确。

  • ii

顺着这个思路,我们考虑新的事件 C 。这回假设事件 C=,23, ,于是有:

D=2P(BC)=13P(C)=P(CD)+P(CD¯B¯)+P(CB)=P(C|D)P(D)+P(C|D¯B¯)P(D¯B¯)+13=23P(B|C)=12

果然,我们再次回到了结论一。

  • iii

根据上面的讨论,我们不妨大胆猜测,只有 P(C)=1 时才能达到结论二。而上述观点的第二不妨刚好是这个情况。

在这种情况下,主持人知道哪个盒子是空的,也就是只打开空盒子。对于 C 更加贴切的表述应该是“打开了一个空的盒子”,而不是“打开的盒子是空的”。即 C= ,此时 P(C)=1 ,因为剩下的两个盒子至少有一个没奖!

结论

至此,我们得到一个可能的结论,将两种不同的结论归结于主持人的两种行为方式。但是我们仍然很难感性理解这个结论,我们可以对这个结论提出明显疑问:其一,为何主持人主观的行为方式会影响这个游戏;其二,作为游戏的参与者,我们只知道有一个盒子被打开了,为何会有两种结果。

对于第一点,我们要明白,概率永远是基于现有信息,而不是基于具体事物。主持人的行为方式恰恰不是一个简单的主观事件,而是影响关键事件概率的要点。如果说我们不是参加这个游戏的人,只是路过看到两个盒子中的一个有奖,那么概率当然是 12 。第二点则是这个问题违反直觉的原因,从参与者来看,我们很容易忽略主持人是知道盒子信息的,从而漏掉了一个条件。殊不知加上这个条件后,”有一个盒子被打开“完全变成了另一个事件。

终于,我们有了一个直觉和理论上都能满足需求的结论。最后不妨再用实验验证一下。

点击打开折叠的代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int pow(int x, int p) {
    int ret = 1;
    while (p) {
        if (p & 1 == 1) ret *= x;
        x *= x;
        p >>= 1;
    }
    return ret;
}
//重复试验1000000次
int t = 1000000;
//使用二进制表示是否有奖,如cha=1代表最初选择1号盒子
int state, cha = 1, chb;
//ans1/ans2表示奖在我们第一次选中的盒子的次数
//其中 ans1是主持人只选空盒,ans2随机选
//oth表示主持人随机选一个盒子,选中有奖的盒子的次数,
//用以调整随机选取情况的基数
int ans1, ans2, oth;
int main(int argc, char* argv[]) {
    srand((unsigned)time(NULL));
    while (t--) {
        state = pow(2, rand() % 3);
        chb   = pow(2, rand() % 2 + 1);
        if (chb & state) oth++;
        else if(cha & state) ans2++;
        if (cha & state) ans1++;
    }
    printf("%lf %lf", 1.0 * ans1 / 1000000, 1.0 * ans2 / (1000000 - oth));
    //0.333409 0.500310
    return 0;
}

(我觉得这种话里有话的题目……属实害人)

无知等同

在和数学超强的大佬交谈后,我得到了一个新的反直觉的原因的解释。

我们用掷硬币做一个糟糕的比喻。我们只知道硬币一共只有正反两种可能,并且概率各为 12 。但是仔细想想,我们真的有办法知道这两面的概率吗?除了反复实验,我们好像没有任何办法来证明它的概率。每当出现这种情况时,我们就经常会以古典概型的经验认为这些样本点都是等可能的。

硬币的例子可能让你觉得不明所以,我们再来看看一个经典的悖论,贝特朗悖论。这个问题是在研究圆内随意画一条弦,长度大于其内接等边三角形的概率。从角度来看,这个概率会是 13,从线的平移来分析,概率又变成了 12,从点分布分析又会变成 14。这些分析对于它们选择的移动方法来说都是”均匀的“,甚至我们也不太能评判哪个更均匀,因为我们没有定义这个均匀到底是线分布均匀还是点分布均匀等等。可这些均匀恰恰是不同的。

当然,离散的情况是不会遇到这么离谱的悖论的。但是我们仍然警觉的反思,我们有没有”无知等同“呢?

我们确实这么做了,由于主持人的行为,盒子的概率变得不相等了。但是我们以”无知“的视角去看,只会看到有一个盒子被打开了,于是自然的假设概率等同,从而得到了 12 这个答案。

posted @   T_horn  阅读(230)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示