“三门问题”的理解和Python验证

三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目 Let’s Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。

参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。

当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊(主持人肯定会开一扇有羊的门)。主持人其后会问参赛者要不要换另一扇仍然关上的门。

问题是:换另一扇门会否增加参赛者赢得汽车的机率?

1.直观理解

当选择了一扇门的时候,选择的这扇门有车的概率是1/3,那么其它两扇门有车的概率是2/3,如下图所示:
“三门问题”的理解和Python验证_第1张图片

这时主持人会在后两扇门中打开一扇有山羊的门,也就是后面的2/3中又有一扇门被确定了

“三门问题”的理解和Python验证_第2张图片

那么此时的2/3的概率会收缩到最后一扇门上,所以在后一扇门上的出现汽车的概率(2/3)会大于第一扇门。

所以换门会提高获得汽车概率

我们不妨把3个门的情况推广到100个门的情况,这时候理解起来会更直观。

有100扇门,首先选择其中一扇(获得汽车的概率是1/100),在其它门后获得汽车的概率是99/100
“三门问题”的理解和Python验证_第3张图片

主持人开了其它99扇门中的98个,那么此时99/100的概率就跑到只有一扇门(图中是37号门)的那里了
“三门问题”的理解和Python验证_第4张图片

此时还是应该换门。

2.列举

我们列举获得汽车的情况

第一种情况:汽车就在你一开始选的门后

此时不换门,汽车就是你的!!!

“三门问题”的理解和Python验证_第5张图片

第二种情况:汽车在第二扇门后

主持人会帮你开第三扇门(他总是会给你开有羊的门)

此时你换门,汽车才是你的

“三门问题”的理解和Python验证_第6张图片.

第三种情况:汽车在第三扇门后

主持人会帮你开第二扇门

此时换门,汽车才是你的
“三门问题”的理解和Python验证_第7张图片

综上,换门获得汽车的概率为2/3,而不换门得到汽车的概率是1/3。

3.用python来验证

首先是不换门的方法stay()

def stay():
    doors = ['car','goat','goat']       #设置三扇门,其中两扇门后面是山羊,一扇门后是汽车
    choose = choice(doors)              #随机选择一扇门
    if choose == 'car':                 #不换门则直接判断
        return 'win'
    else:
        return 'lose'

也就是不换门就会选到汽车的情况。

然后是换门的方法switch():

def switch():
    doors = ['car', 'goat', 'goat']
    choose = choice(doors)
    doors.remove(choose)               #选择的门放一边
    doors.remove('goat')               #剩下的门,去掉一只山羊
    if doors == ['car']:               #换门
        return 'win'
    else:
        return 'lose'

换门后会选到汽车的情况。

完整代码

from random import choice

def stay():
    doors = ['car','goat','goat']       #设置三扇门,其中两扇门后面是山羊,一扇门后是汽车
    choose = choice(doors)              #随机选择一扇门
    if choose == 'car':                 #不换门则直接判断
        return 'win'
    else:
        return 'lose'

def switch():
    doors = ['car', 'goat', 'goat']
    choose = choice(doors)
    doors.remove(choose)               #选择的门放一边
    doors.remove('goat')               #剩下的门,去掉一只山羊
    if doors == ['car']:               #换门
        return 'win'
    else:
        return 'lose'



if __name__ == '__main__':
    total = 100000
    count_switch = 0
    win_switch = 0
    count_stay = 0
    win_stay = 0
    for i in range(total):
        choose = choice([1,2])          #随机选择换门还是不换门
        if choose == 1:
            count_switch += 1
            if switch() == 'win':
                win_switch += 1
        else:
            count_stay += 1
            if stay() == 'win':
                win_stay += 1

    print('换门次数:',count_switch)
    print('换门后得到汽车:',win_switch,'%.2f%%'%(100*win_switch/count_switch))
    print('不换门:',count_stay)
    print('不换门后得到汽车:',win_stay,'%.2f%%'%(100*win_stay/count_stay)) 

运行情况:
这里写图片描述

由此也可以验证我们上面说的换门后获得汽车的概率为2/3的说法。

参考资料:
https://www.bilibili.com/video/av1248411/?from=search&seid=10059995357849416858
https://baike.baidu.com/item/%E4%B8%89%E9%97%A8%E9%97%AE%E9%A2%98/1242689?fr=aladdin
http://blog.csdn.net/hustmba99/article/details/55668027

你可能感兴趣的:(数学)