用python解决“玛丽莲三门”问题

(整期优先)网络出版时间:2024-04-17
/ 3

用python解决“玛丽莲三门”问题

孙玉伟

120110198602192452

摘要:“玛丽莲三门”问题困扰了无数人,甚至很多数学家都不能正确解决这个问题。本文将使用python程序,先模拟出三门问题的正确结果。然后将三门问题的逻辑解释清楚。最后将python代码展示并加解释。

关键词:python 玛丽莲三门

一、玛丽莲三门问题由来:

玛丽莲是美国专栏作家,智商高达228,吉尼斯纪录保持者。最具有争议的玛丽莲问题是“三门问题”(类似“非常6+1”中的翻牌):舞台上有三个门,一个门后是轿车,两个门后是山羊,选手可以选择其中一扇门。这时候主持人在另外两扇门中排除掉一个有山羊的门,舞台上还剩下两扇门,主持人问你要不要更换选项。

这时候很多人都坚信自己的感觉,选择不更换。但玛丽莲给出的答案是必须更换选项。当时很多的数学家对玛丽莲进行抨击,说玛丽莲仰仗自己的威望和高智商故意误导大众。最近甚至还有人把这个问题与量子力学扯上了关系。

二、使用计算机模拟玛丽莲问题的结果:

那么我们就用python在计算机中模拟一下这个游戏。

图1

如图1所示:我们设置了三个盒子,选中其中一个后不更换选项,将这个游戏重复1000次,结果是我们选对了362次,大约是1/3的正确率。我们再将选项调整一下选择更换选项看一下结果:

图2

如图2所示:我们选择更换选项中奖概率为650次,约2/3。我们将盒子数量增加至10个,然后选择“不更换”看一下运行的结果:

图3

如图3所示:我们在10个盒子中选定一个后,不更换选项,结果是我们中奖99次,正确率约为1/10。注:以上结果为随机结果,每次的模拟情况会略有差别。

我们反推,如果选择了更换选项,我们正确的概率为9/10。也就是说我们中奖的概率和盒子的总数有关系。这个结果是不是非常出乎很多人的意料。

三、玛丽莲问题的分析:

3.1 实际上只有两个选项:

我们来分析一下为什么是1/3。我们假设门的总数是3个分别是A、B、C,大奖在任何一扇门背后的概率都是1/3也就是说三扇门是相同的,我们随便选择一扇假设我们选择了A。这时候我们中奖的概率是1/3,主持人在BC中排除了一个假设排除了B,B中的山羊这时候可以去厨房了。主持人问我们要不要将答案换成C。因为在主持人排除选项之前我们中奖的概率是1/3,主持人排除选项后我们如果选择不更换选项的我们中奖的概率还是1/3,大家都知道所有选项概率总和是100%,那么我们如果更换了选项我们中奖的概率就成了1-1/3=2/3。

3.2 为什么不是1/2:

可能有人还是会问及明明剩下两个选项,两扇门任何一扇门应该都是1/2。为什么一下成1/3?这里就和主持人排除选项有关系,我们还继续上面的情况,我们选择了A选项,这时候主持人只会在BC中排除选项,他是绝不会将A排除了。这样就将没有BC中没有被排除的选项概率提升了。

3.3 更换选项相当于选择了2个:

如果还不明白我们可以这么理解,如果我们选择更换选项,其实我们是选择了BC两个选项,这时候我们的中奖概率是不是提升到了2/3。主持人帮你排除掉一个错误的,和我们自己将BC都打开是相同的,如果BC中有汽车我们就开回家。可以这么解释,我们看似是三选一,其实并不是,我们最后的选择是“换”与“不换”,两个选项。换的中奖概率是1/3,反之不换的中奖概率是2/3。

3.4 古典概型计算

首先我们把三个门分成两组,第一组为第一次选定组A只有一扇门,第二组为第一次未选定组B有两扇门。大奖出现在第一扇门的概率为1/3,同理大奖出现在第二扇门的概率为2/3。

主持人在B组中排除掉一个选项。

3.4.1不更换选项中奖概率为1/3;

3.4.2更换选项计算方法:

这时候有两种可能第一种,大奖在A组中,这时候不论主持人如何操作,1/3*0%=0我们中奖的概率都是0。

第二种可能,大奖在B组中,由于主持人,一定会排除错误选项,所以我们这时候中奖概率为2/3*100%=2/3。

我们将上述两个可能性合并0+2/3=2/3。

所以我们更换选项中奖的概率为2/3,不更换选项中奖的概率为1/3。

三、统计结果分析:

本章将用实际的统计结果结合统计理论解释,为什么第一次的运行结果约为362次?上文已经说明了我们的最终的选择其实只有“换”和“不换”,也就是说我们总的运行结果应该是符合二项分布的X ~ B(n,p),n为重复的次数,p为发生的概率。期望为E(x)=np,方差为D(x)=np(1-p)。如果我们将上述实验再重复多次(如10000次)那么结果将近似于D:\Documents\WeChat Files\martinyy11\FileStorage\Temp\1672300295510.png的正态分布。我们同样使用python将结果打印成图:

D:\Documents\WeChat Files\martinyy11\FileStorage\Temp\1672299944480.png

图4

我们按照3个门,1000次重复,得出一个K值,这里统计了10000个K值。我们理论上来计算期望为峰值位置约为333,也就是说,大部分的K值都会在333附近。如图4所示,结果与预期的情况基本相同。所以图一的模拟结果是符合二项分布的。

四、代码讲解

4.1 3选1子函数代码的逻辑(这里不讲解语法):

# 这是一个抽奖活动
# 玩家在n个盒子里选择一个
# 无论正确与否 主持人都会帮助玩家在未选择(n-1)个盒子中去掉(n-2)个未中奖的盒子,场上只保留两个盒子
# 这时候还剩下2个盒子 一个是玩家第一次选的 一个是未选择盒子中主持人剩下的
# 这时候主持人问玩家要不要在场上剩下的两个盒子中更换选项0=不换 1=换

from random import shuffle
def choose1in3():
    while True:
        mm=input("请输入盒子的总数:")
        a=input("是否更换答案0=不换 1=换:")
        xunhuan = input("循环次数:")
        i = int(a)
        m= int(mm)
        xun = int(xunhuan)
        k = 0
        list = [1]
        for c in range(0,m-1):
            list.append(0)
        if i == 0:
            qingkuang = "不更换选项"
            for b in  range(1,xun):
                shuffle(list)
                if list[0]==1:
                    k=k+1
        elif i == 1:
            qingkuang = "更换选项"
            for b in range(1, xun):
                shuffle(list)
                if list[0] != 1:
                    k = k + 1
    print("测试了%d次,在 %s 的情况下,中奖%d次"%(xun,qingkuang,k))
if __name__ == "__main__":
    choose1in3()

首先我们设置门的个数、换或者不换选项、和游戏循环的次数。其次,一个列表其中只有一个元素1其余元素为0, list = [1,0,0...]。这个1就是大奖汽车,0是山羊。再次,我们使用shuffle(list)将list中的元素随机排序(打乱顺序),这里强调一下shuffle(list)此句代码是这段代码的核心,他保证了list中元素完全随机排序,不受人为干扰。我们默认选择第一个选项list[0](因为任何一个选项中奖的概率是相同的)。将游戏循环N多次,k是计数器初始值为0,我们每中奖一次k就加1。最后我们打印出k的值。

从代码的逻辑中我们也不难看出,我们起初选择的是哪个门并不重要,代码中也没有提到排除哪个选项,重要的是我们选择“换”还是“不换”。

在此多加解释一下,如果游戏中门的数量是大于3的。我们将排除n-2个选项,也就是说最终场上只留下2个选项。

4.2 统计部分代码分析:

from matplotlib import pyplot

def tongji():

    tj = list()

    for i in range(10000):

        tj.append(choose1in3())

    print(tj)

    y = tj

    x = range(min(y),max(y)+7,7)

    pyplot.hist(y,max(y)-min(y))

    pyplot.xticks(x,rotation=45)

    pyplot.title("Marilyn's three door question")

pyplot.show()

代码首先对choose1in3()子程序的K值进行统计,共10000次,然后将这10000个K值存放在列表tj中,然后使用pyplot.hist(y,max(y)-min(y))绘制直方图。最后将图形显示出来。

五、总结

我们使用python模拟了玛丽莲三门问题,然后我们对问题本身进行了分析。随后我们又使用统计的方法对结果的数值进行了分析,最后我们将代码展示并做讲解。如果未来我们遇到类似的选择问题,我们一定要选择更换,因为这样我们会大幅度提升我们正确的概率。

参考文献

[1]高等数学[M].电子工业出版社,官金兰,2020

[2]Python语言程序设计基础[M].大连理工大学出版社,吴伶琳,  2019

[3]大数据技术与应用基础项目教程[M].人民邮电出版社,李俊杰,  2018

[4]Python 3程序设计[M].人民邮电出版社,刘德山,2018

[5]基于MATLAB的计算机图形与动画技术[M].清华大学出版社,于万波,  2007

[6]MATLAB 7.0图形图像处理[M].国防工业出版社,王家文,李仰军编著,2006

[7]MATLAB数学计算与工程分析范例教程[M].中国铁道出版社,石博强,赵金编著,2005