python实验之蒙提·霍尔(Monty Hall)悖论游戏

一、实验目的
了解蒙提霍尔悖论内容和游戏规则;熟练运用字典方法和集合运算;了解断言语句assert 的用法;熟练运用Python中的循环结构解决实际问题。
二、实验内容
假设你正在参加一个有奖游戏节目,你被要求在三扇门中选择一扇:其中一扇后面有一辆汽车;其余两扇后面则是山羊。你选择了一道门,假设是一号门,然后主持人(知道门后面有什么)选择并开启了另一扇后面有山羊的门,假设是三号门。这时,主持人问你:“你想选择二号门吗?”,然后根据你的选择确定最终要打开的门,并确定你获得山羊(输)或者汽车(赢)。转换你的选择对你来说是一种优势吗?
编写程序,模拟上面的游戏。

import random


def product_things():
    # 创建字典作为3扇门及其后面的物品
    d = {}
    # car number
    tmp = random.randint(0, 2)
    # thing to door
    for i in range(3):
        if i == tmp:
            d['door' + str(i)] = 'car'
        else:
            d['door' + str(i)] = 'goat'
    return d


def game():
    door_and_thing = product_things()
    car_number = list(door_and_thing.values()).index('car')
    #print(car_number)
    first_choose_number = int(input('Choose a door to open:'))
    # 判断数字是否在0-2之间,否则异常
    assert first_choose_number <= 2
    assert first_choose_number >= 0
    # 判断第一个选择的数字是不是car
    if first_choose_number == car_number:  # 是
        # 输出out number,不等于car对应的值
        while True:
            out_number = random.randint(0, 2)
            if out_number != car_number:
                break
    else:  # 不是
        # 输出另一个goat的数字
        out_number = 3 - first_choose_number - car_number
    # 主持人告诉一个山羊的位置
    print('"goat" behind the door ' + str(out_number))
    # 主持人询问是否换门
    else_number = 3 - out_number - first_choose_number
    choose_boolean = input('Switch to ' + str(else_number) + '?(y/n)')
    if choose_boolean == 'y':
        second_number = else_number
    else:
        second_number = first_choose_number
    # 最终选择的门是否为car
    if second_number == car_number:
        print('You win!')
    else:
        print('You lost!')
    return


while True:
    print("=====================================")
    game()
    choose_continue = input('Do you want ti try once more?(y/n)')
    if choose_continue == 'n':
        break

python实验之蒙提·霍尔(Monty Hall)悖论游戏_第1张图片

附:转换你的选择对你来说是一种优势吗?
我编写了一个程序,自动化实现了这个游戏,并得出了这个问题的答案。

import random


def product_things():
    # 创建字典作为3扇门及其后面的物品
    d = {}
    # car number
    tmp = random.randint(0, 2)
    # thing to door
    for i in range(3):
        if i == tmp:
            d['door' + str(i)] = 'car'
        else:
            d['door' + str(i)] = 'goat'
    return d


def game(tmp):
    door_and_thing = product_things()
    car_number = list(door_and_thing.values()).index('car')
    #print(car_number)
    #first_choose_number = int(input('Choose a door to open:'))
    first_choose_number=random.randint(0,2)

    # 判断数字是否在0-2之间,否则异常
    assert first_choose_number <= 2
    assert first_choose_number >= 0
    # 判断第一个选择的数字是不是car
    if first_choose_number == car_number:  # 是
        # 输出out number,不等于car对应的值
        while True:
            out_number = random.randint(0, 2)
            if out_number != car_number:
                break
    else:  # 不是
        # 输出另一个goat的数字
        out_number = 3 - first_choose_number - car_number
    # 主持人告诉一个山羊的位置
    #print('"goat" behind the door ' + str(out_number))
    # 主持人询问是否换门
    else_number = 3 - out_number - first_choose_number
    #choose_boolean = input('Switch to ' + str(else_number) + '?(y/n)')
    choose_boolean = tmp
    if choose_boolean == 'y':
        second_number = else_number
    else:
        second_number = first_choose_number
    # 最终选择的门是否为car
    if second_number == car_number:
        #print('You win!')
        return True
    else:
        #print('You lost!')
        return False
    #return



secceed = 0
falsed = 0
tmp=input("转换与否:input y or n ")
for i in range(100000):
    result = game(tmp)
    #print('Do you want ti try once more?(y/n)')
    if result is True:
        secceed += 1
    elif result is False:
        falsed += 1
print('成功率:')
print(secceed / (secceed + falsed))
#print((falsed / (secceed + falsed)))

在这里插入图片描述在这里插入图片描述

你可能感兴趣的:(python实验之蒙提·霍尔(Monty Hall)悖论游戏)