• 三门问题的 Python 实验数据 & 直观但非严谨的证明


    异想之旅:本人原创博客完全手敲,绝对非搬运,全网不可能有重复;本人无团队,仅为技术爱好者进行分享,所有内容不牵扯广告。本人所有文章仅在CSDN、掘金和个人博客(一定是异想之旅域名)发布,除此之外全部是盗文!


    原题描述

    三门问题的主要内容表述如下:在这个电视节目中有三扇门,其中有且仅有一扇门后面放有汽车。

    此时观众要随机选择一扇门,在参赛者选择了一扇门之后,主持人并不会立刻打开这扇门,而是从剩下的两扇门中打开一扇没有汽车的门。

    随后主持人会给观众提供一次重新选择门的机会,此时观众可以保持自己的第一选择不变,也可以更换自己的选择选择另外一扇未被开启的门。

    问:此时换门与不换,哪种选择选中汽车的概率更大?

    (描述复制自三门问题 - 知乎,有删改)

    先说答案:换门后概率更大,为 2 3 \frac 2 3 32 ;不换的话只有 1 3 \frac 1 3 31

    Python 实验

    事实大于雄辩,我们可以使用 Python 对实际情况进行模拟:

    import random
    
    
    def which_choice_can_earn_car():
        # 初始化三扇门
        doors = [1, 2, 3]
        # 随机选择一扇门为有车的门
        car = random.choice(doors)
        # 随机选择一扇门为观众选择的门
        choice = random.choice(doors)
    
        # 可以被主持人开的门(不包括观众选择的门和有车的门)
        doors_can_be_opened_by_host = [i for i in doors if i not in [car, choice]]
        # 主持人在可开的门中随机选择的门
        door_opened_by_host = random.choice(doors_can_be_opened_by_host)
    
        # 假设观众更换门,则更换后的门一定是除去“第一次选择的门”和“主持人开的门”后剩下的唯一一个
        doors.remove(door_opened_by_host)
        doors.remove(choice)
        re_choice = doors[0]
    
        # 由于主持人打开的一定是没有车的门,因此车一定在观众两次选择的门之一中,直接判断这两个门后面是否有车,即可知道是否应该换
        if choice == car:
            return 'No change'
        elif re_choice == car:
            return 'Change'
    
    
    if __name__ == '__main__':
        # 统计换门中奖和不换门中奖的次数
        change = 0
        no_change = 0
        # 测试一万次
        for i in range(10000):
            if which_choice_can_earn_car() == 'Change':
                change += 1
            else:
                no_change += 1
        # 输出结果
        print(f'Change: {change}\nNo change: {no_change}')
    
    • 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

    第一次运行,神奇的 random 库就很给我面子,直接输出了理论概率:

    Change: 6667
    No change: 3333
    
    • 1
    • 2

    由此可见,的确换门的概率为 2 3 \frac 2 3 32 ,不换门的概率依然是 1 3 \frac 1 3 31 (主持人不开任何门的中奖概率是 不用我再说了吧)

    简单的分析证明

    相信凭借九年义务教育的优秀成果,大家都认可这样下面这些结论:

    1. 在这段代码运行过程中,对程序进行观测(例如输出更多中间的运算步骤)不影响运算结果
    2. 第一次选中车的概率(即主持人不开门、直接在观众第一次选择后公布答案的情况下选中汽车的概率)为 1 3 \frac 1 3 31
    3. 车在第一次选的门之外的两个门中的任意一个的概率为 2 3 \frac 2 3 32
    4. 当主持人打开一扇门后,观众换为剩下的最后一扇门后,中奖的概率一定不是 1 3 \frac 1 3 31

    (第一条也就是说,计算机程序运行不适用量子力学测不准原理,为了通俗易懂做前面的非严谨解释)

    有了上面的结论 4 就好说了,我们现在只需要说明为什么换门后概率是 2 3 \frac 2 3 32 而不是 1 2 \frac 1 2 21

    从程序角度出发

    我们将这段代码进行更改:

        # 初始化三扇门
        doors = [1, 2, 3]
        # 随机选择一扇门为有车的门
        car = random.choice(doors)
        # 随机选择一扇门为观众选择的门
        choice = random.choice(doors)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在最后增加一行输出语句,判断观众第一次的选择能否得到汽车:

        # 初始化三扇门
        doors = [1, 2, 3]
        # 随机选择一扇门为有车的门
        car = random.choice(doors)
        # 随机选择一扇门为观众选择的门
        choice = random.choice(doors)
        
        print(choice == car)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    显然在此处输出为 True 的概率为 1 3 \frac 1 3 31 (结论2)

    又由于变量 car 和 choice 的值均未发生变化,所以无论是在此处还是 which_choice_can_earn_car 函数的最后,这个判断语句答案为 True 的概率都不会发生变化

    又因为在函数最后,主持人已经排除了一个没有车的门,所以车只有可能在第一次选的门和第二次选的门中的一个,而第二次选的门在观众第一次选完、且主持人打开一扇门后是唯一确定的,所以换选选中汽车的概率就是不换选未选中汽车的概率,即 1 − 1 3 = 2 3 1 - \frac 1 3 = \frac 2 3 131=32

    从直觉角度出发

    最开始选中的概率是 1 3 \frac 1 3 31 ,选不中的概率为 2 3 \frac 2 3 32

    我们可以把未选择的这两扇门看作一个整体,这个整体的中奖概率就是 2 3 \frac 2 3 32 。但是此时我们无法直接利用这个整体的概率,因为这里面还有两扇门,选择这个整体中的任意一扇结果仍是 1 3 \frac 1 3 31

    而主持人在这个整体的两扇门中打开了一扇没有汽车的门,此时我们选择这个整体便可以利用整个 2 3 \frac 2 3 32 啦!因为看作整体后,局部的操作不会影响这个整体的概率,而此时整体中的选项从两个变成了一个,自然这一个就分配到了全部 2 3 \frac 2 3 32 的概率。

    再有说服力一点

    我们把三扇门放大到一万扇门。

    假设现在有一万扇门,一扇门后面有汽车。现在你随机选择一个,主持人打开了 9998 扇后面没有汽车的门,现在除了你选择的还剩下一个。

    此时为了选中汽车,你换不换?相信大多数人的选择是换,并且你很容易接受,最开始我们选中的概率仅有万分之一,而如果我们第一个没选中,那么换门后一定选中,也就是说换门后的概率是 1 − 1 10000 = 9999 10000 1 - \frac {1} {10000} = \frac {9999} {10000} 1100001=100009999

    那么把 10000 换成 3,道理其实是一样的。

    最朴素的树状图角度理解

    img
    img
    图片来源:“三门问题”的理解_weixin_42467709的博客-CSDN博客_三门问题

  • 相关阅读:
    低代码&无代码,你知道该怎么区分和选择吗?
    Word怎么删除空白页?6个方法随便用!
    机械臂运动控制,通讯的解包->运动控制->数据封包上报过程
    centos下安装JDK环境(离线)
    centos 安装freeswitch
    mindspore中使用LeNet脚本训练时出现报错
    C语言函数调用的过程图解深入剖析
    第一章:最新版零基础学习 PYTHON 教程(第一节 - 简介)
    Linux版 MCSM9 面板更新教程
    C++进阶篇5-哈希
  • 原文地址:https://blog.csdn.net/weixin_44495599/article/details/126362239