蒙特卡洛与三门问题

参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门则各藏有一只山羊。
当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后问参赛者要不要换另一扇仍然关上的门。
问题是:换另一扇门是否会增加参赛者赢得汽车的几率?如果严格按照上述条件,即主持人清楚地知道,自己打开的那扇门后面是羊,那么答案是会。
常理分析:我们知道,当参赛者一开始如果选中的是山羊,那换门之后百分之百赢;但如果参赛者先选中汽车,换之后百分之百输。而选中山羊的概率是2/3,选中汽车的概率是1/3。所以不管怎样都换,相对最初的赢得汽车仅为1/3的机率来说,转换选择可以增加赢的机会。对于此,可能会出现以下的几种情况

我们假设三扇门编号为0,1,2

数学分析:

我们选中的是1或者2,参赛者选择换或者不换,选中车的概率为1/3。如果我们选中的是0,参赛者可以选择换或者不换,他只有在选择不换的情况下才会中奖所以中奖几率为1/6。

代码分析:

先定义一个数组,里面有三种选择的方案,参赛者面临的就是一个二次选择的事件。

定义一个数组,里面装有三扇门,0,1,2,然后参赛者进行第一次选择,选择之后,假设参赛者选中的是0(参赛者不知道),主持人开启了另一扇门1或者2开出了羊,参赛者就要做出选择,保持原来的位置不变,或者去掉一个羊门后的两个门中,从剩下两扇门中随机做出选择,或者排除一扇空门后,放弃原来的选择,直接选择另一扇门;假设参赛者一开始选中的是1或者2,主持人开启了另一扇是羊门,即1或者2,此时参赛者仍然需要做出选择,可以仍然选择最开始的位置,或者去掉这一个羊门后的两个门中,从剩下两扇门中做抉择,或者排除一扇空门后,放弃原来的选择,直接选择另一扇门;在这期间我们不改变奖品的位置,一直在0号门,最终求的概率,次数训练一万次

代码及结果:

import random as rnd

 # 定义三种方法,分别为'stick', 'choose', 'switch'
strategy = ['stick', 'choose', 'switch']


def MC(strategy, times):
    wins = 0
    for trail in range(times):
        # 假定,车在0号门,我们不一定选择哪一个门
        envelops = [0, 1, 2]
        # 第一次随机选取一扇门
        first_choice = rnd.choice(envelops)
        # 根据第一次的选择情况的不同,第二次选择面临两种不同的备选组合

        # 如果第一次选择了0号门,那么在打开另外两个羊门中的一个后
        # 第二次将要在0号门和未打开的羊门(1 or 2)中作出选择
        if first_choice == 0:
            envelops = [0, rnd.choice([1, 2])]
        # 如果第一次没有选中0,那么此时被打开的必然是另一个羊门,那么
        # 在第二次选择时,将在0和自己现在所处的门(first_choice)作出选择
        else:
            envelops = [0, first_choice]

        # 采取不同的策略进行第二次选择

        # 保持原来位置不变
        if strategy == 'stick':
            second_choice = first_choice
        # 在除去一个羊门后的两个门中,随机选择一个
        elif strategy == 'choose':
            second_choice = rnd.choice(envelops)
        # 排除一扇羊门后,放弃原来的选择,直接选择另一扇门
        elif strategy == 'switch':
            envelops.remove(first_choice)
            second_choice = envelops[0]

        # 记得,奖品在0号门
        if second_choice == 0:
            wins += 1
    # 计算获奖的概率值
    p = wins / times
    print('第二次选择采用' + strategy + '方法,获奖的概率为:' + str(p) + '(模拟次数为' + str(times) + ')')


MC('stick', 10000)
MC('choose', 10000)
MC('switch', 10000)

结果:可以看到三种方法获奖的概率

蒙特卡洛与三门问题_第1张图片

你可能感兴趣的:(python,numpy,算法)