Wlgls 冲鸭!

三门问题

2019-06-28

前段时间看到了一个有意思的三门问题,就很想记录下来,但是因为期末复习没有时间,现在记一下

三门问题

百度百科-三门问题 现在有三扇门,只有一扇门有汽车,另外两扇门是山羊。 汽车事前是等可能地被放置于三扇门的其中一扇后面。 参赛者在三扇门中挑选一扇。他在挑选前并不知道任意一扇门后面是什么。 主持人知道每扇门后面有什么。 如果参赛者挑了一扇有山羊的门,主持人必须挑另一扇有山羊的门。 如果参赛者挑了一扇有汽车的门,主持人等可能地在另外两扇有山羊的门中挑一扇门。 参赛者会被问是否保持他的原来选择,还是转而选择剩下的那一扇门。 转换选择可以增加参赛者拿到汽车的机会吗?

求解

错误的想法

一开始有三扇门,自己所选择的门里是汽车的可能性是1/3, 就算打开了一扇有山羊的门, 剩下两个门中所含有汽车的可能性就是1/2,所以换不换都无所谓。

正确的解法

但是正确答案却十分反直觉,因为参赛者再次选择是基于主持人打开一个山羊门的条件下的,也就是这是一个条件概率

我们使用贝叶斯公式也解释这个问题

1、首先,我们设An为第n个门后有汽车,则P(An) = 1/3

2、我们知道,主持人打开门的概率会随着我们所选择的门的概率改变的,所以如果我们选择了一个有汽车的门,则主持人选择剩下两个门的概率是1/2,如果我们选择了一个山羊门,则主持人选择山羊门的可能性是1,选择汽车门的可能性是0(因为主持人是知道门后面的情况的)

3、我们不妨设参赛者选择了第一个门,而主持人打开了第二个门,设为B,则P(B|A1)=1/2(也就是说第一个门后面有汽车,主持人选择第二个门的概率是1/2),P(B|A2)=0, P(B|A3)=1(也就是说第三个门后面有汽车,选择第二个门的可能性是1)

4、现在我们就需要计算在主持人打开第二个门之后第一个门是汽车门的可能性,也就是说求P(A1|B)

5、贝叶斯公式是这么来的百度百科-贝叶斯公式

2019-10-16-22-46-40.png

之后我们根据这个就可以求出这个时候继续选择第一个门获奖的概率为1/3

模拟

但是贝叶斯公式好抽象啊,所以还是不太清楚,概率是频率的模拟嘛,所以通过频率在模拟嘛。

import random

def choice():

    doors = [0, 0, 1]
    # 我们假设第三个门里是汽车

    selected_index = random.randint(0, 2)
    # 随机选择,保证公正性
    
    doors.remove(doors[selected_index])
    # 选择过后,我们将所选移除

    if doors[0] == 0 and doors[1] == 0:
        removeed_index = random.randint(0, 1)
        doors.remove(doors[removeed_index])
    else:
        doors.remove(0)
    # 主持人移除山羊门,如果所选择的是car,则随机移除一个
    # 如果选中山羊门,则直接移除山羊门
    
    # 现在选择更换门,因为已经移除了参赛者选择的门和主持人所选择的门,列表中只剩下
    # 要更换的门
    choice_door = doors[0]

    if choice_door == 1:
        return True
    else:
        return False


def three_door_question(times: int):
    

    count_win = 0
    count_false = 0

    for _ in range(times):
        if choice():
            count_win += 1
        else:
            count_false += 1

    # 设置一下,输出形象
    items = {
        'count_win': count_win, 
        'count_win_probability': count_win/times, 
        'count_false': count_false,
        'count_false_probability': count_false/times
    }

    return items

if __name__ == '__main__':
    print(three_door_question(1000))
    print(three_door_question(10000))
    print(three_door_question(100000))

结果
{'count_win': 675, 'count_win_probability': 0.675, 'count_false': 325, 'count_false_probability': 0.325}
{'count_win': 6738, 'count_win_probability': 0.6738, 'count_false': 3262, 'count_false_probability': 0.3262}
{'count_win': 66756, 'count_win_probability': 0.66756, 'count_false': 33244, 'count_false_probability': 0.33244}

Toc
Related