蒙塔卡罗法计算蒙提霍尔问题(三扇门问题)

问题描述:游戏中有三扇门,只有一扇里面有汽车,另外两扇门是羊,在选手选择了一扇门之后开启之前,主持人打开一个有羊的门询问选手是否更换选择。问更换之后获奖的概率是否会增加?

分析:本题中一个比较关键的隐蔽条件是主持人知道哪扇门里是羊,他打开的必然是有羊的那扇门!下面分类讨论选手抽中汽车的概率:

  1. 如果第一次没有抽中汽车,并且主持人将有羊的门打开,此时情况已经明确了,汽车一定在剩下的那扇门中,选手更换的话必然是抽中汽车的。(此处容易犯错,会误以为抽中汽车的概率有1/2,这样想就忽略了主持人必然开出的是羊这个条件)
  2. 如果第一次抽到汽车,主持人将有羊的门打开,此时只要换了就失败。这种情况不会有什么问题。

代码实现:

       首先是用random函数随机选择开的门的编号,随机选择将车放到哪扇门里。

       之后就是进行判断,第一次没抽到车之后,换门之后返回什么,不换门之后返回什么。

       最终在写一个函数用于计算获得车的次数,然后再与总数相除,得到概率。

import random


def choseGame(change):
    door = {0, 1, 2}  # 代表门的编号
    choseDoor = random.randint(0, 2)  # 随机选择三个门 中的一个的编号
    car = random.randint(0, 2)  # 随机选择一个编号的门 把车放入其中
    # 判断是否更改,并且设置做出选择之后的结果
    # 如果选择的编号不是汽车
    if choseDoor != car:
        # 判断是否更换门,如果更换则有二分之一的可能是对的,明显这种想法是错的
        # 在主持人知道哪扇门有羊的情况下,如果第一次没抽到车,主持人打开有羊的门 那么换
        # 之后必定是车
        if change:
            '''rate = random.randint(0, 1)
            if rate == 0:
                return True
            else:
                return False'''  # 上面的方法是错的 原因如上
            # 正确代码
            return True
        else:  # 如果不换 必然是错的。
            return False
    else:  # 如果上来就抽到车 那么换门必定错
        if change:
            return False
        else:  # 不换门一定是对的
            return True


# 根据游戏计算概率
def winProbability(change, N):
    # 先将win设置为0 随之后的游戏逐一叠加,最后与总次数相除计算概率
    win = 0
    for i in range(0, N):
        # 调用choseGame函数 如果是True说明选的是车则win加一
        if choseGame(change):
            win += 1
    # 退出循环之后说明计算完了 得到概率
    probability = win / N
    print(probability)


N = 100000
print("每次都换门")
winProbability(True, N)
print("每次都不换门")
winProbability(False, N)

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