模拟蒙蒂霍而悖论游戏——三门游戏python

蒙蒂霍而悖论,源自博弈论的一个数学问题,出自美国一档电视节目Let’s Make a Dea,取名为该档节目的主持人姓名,一般指三门问题。

问题描述

假设你是一个参赛者,现在有三扇门可选,一扇后面是汽车,其余两扇后面是山羊,选中后面是汽车的门,则获得奖励。

你先选择一扇门,你并不知道每扇门后面的东西,可是主持人知道,主持人在剩余的两扇你未选择的门中打开一扇后面是山羊的门,并在此时问你,你想要改选你选择的门吗?问题是改选的话,是否会增加你获奖的几率。

看到此题大家第一反应是,有三扇门时获奖概率是1/3,当只有两扇门时,获奖概率是1/2。
可事实却并不是这样的。真实的结果是不换门的话,赢得汽车的几率是1/3。换门的话,赢得汽车的几率是2/3。答案在逻辑上并不矛盾,但是却十分违反直觉。

答案的解释

当你觉得是1/2时,其实内心已经潜意识的把只有两扇门的时候的获奖率考虑成了一个独立事件。
可是我们讨论的换门问题并不是独立事件,它以第一次的选择为基础,在概率学中,这是一种条件概率

实际上,当你决定换门时,得奖的概率只取决于你第一次所选择的门后的东西。若你第一次的选择是汽车,如果换门,则不会得奖,而选择汽车的概率是1/3。若第一次选择的是山羊,则只要换门就会得奖,此时概率是2/3,选择山羊的概率为2/3.

下面来看一下代码模拟该游戏

# 蒙蒂霍而悖论游戏
# 引入randrange函数随机生成数字
from random import randrange

# 定义初始化门函数,在三个门中随机选择一个放汽车,使用字典存放
def init():
    result={
     i:"goat" for i in range(3)}
    r=randrange(3)
    result[r]='car'
    return result

# 模拟游戏的核心代码
def start():
	# 初始化门
    doors = init()
    while True:
    	# 控制选择的第一个门数是0、1、2
        try:
            firstDoorNum = int(input("choose a door:"))
            assert 0<=firstDoorNum<=2
            break
        except:
            print("door number must be 0,1,2")
    # 主持人查看剩余两个门后情况 
    for door in doors.keys()-{
     firstDoorNum}:
        if doors[door]=="goat":
        	# 打开其中一个为山羊的门
            print('"goat" behind the door',door)
            # 获取第三个门号,让玩家选择
            thirddoor=(doors.keys()-{
     door,firstDoorNum}).pop()
            change = input('switch to {}?(y/n)'.format(thirddoor))
            # 用于表示玩家最后选择的门号
            finaldoornum = thirddoor if change=='y' else firstDoorNum
            if doors[finaldoornum] =='goat':
                return 'I win'
            else:
                return 'you win'

# 循环进行游戏,直到用户不想继续为止
while True:
    print('='*30)
    print(start())
    r=input('do you want to try once more?(y/n)')
    if r=='n':
        break

你可能感兴趣的:(python,python,游戏)