实验:模拟蒙提霍尔悖论游戏 本实验还是非常简单的,主要是对字典中键和值的类型转换有点麻烦,游戏主体部分可能有些笨重,欢迎喷我~~


文章目录

  • 一、蒙提·霍尔悖论
  • 二、游戏实现
  • 1.生成初始化的三扇门以及门后面的物品。
  • 2.实现游戏的主体部分
  • 3.利用while循环,调用函数,进行游戏。
  • 三、源代码


一、蒙提·霍尔悖论

蒙提霍尔悖论亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论、三门问题(Monty Hall problem)。
三门问题(Monty Hall problem),是一个源自博弈论的数学游戏问题,大致出自美国的电视游戏节目Let’s Make a Deal。问题的名字来自该节目的主持人蒙提·霍尔(Monty Hall)。
这个游戏的玩法是:参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门就可以赢得该汽车,而另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人会开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门会否增加参赛者赢得汽车的机会率?如果严格按照上述的条件的话,答案是会—换门的话,赢得汽车的机会率是 2/3。
这条问题亦被叫做蒙提霍尔悖论:虽然该问题的答案在逻辑上并不自相矛盾,但十分违反直觉。这问题曾引起一阵热烈的讨论。

二、游戏实现

1.生成初始化的三扇门以及门后面的物品。

  三扇门分别用0,1,2来编号。
  由门和礼物的对应关系想到用字典的键值对来存储,但是要随机组合的话,字典是没有这种功能的,而列表有一个打乱列表内元素顺序的方法random.shuffle (lst ),这就需要先把门和礼物先存储到列表中,然后zip组合。
  注意:shuffle()函数是没有返回值的,执行之后原列表lst中的元素直接被打乱。

def initialize_game():
    doors = [0,1,2]
    gifts = ['goat1','goat2','car']
    random.shuffle(doors)
    random.shuffle(gifts)
    dic = dict(zip(doors,gifts))
    # print(dic)
    return dic
    
initialize_game()

输出:

蒙蒂霍尔游戏Python 模拟蒙蒂霍尔悖论游戏_调用函数

2.实现游戏的主体部分

def game_body(dictionary):
    print('===================================')
    '''
        选手选择第一扇门
    '''
    first_key = input('Choose a door to open:')
    first_value = dictionary[int(first_key)]
    # print(first_value)

    '''
        主持人打开有goat的一扇门
    '''
    del[dictionary[int(first_key)]]
    # print(dictionary)
    goat_key = list(dictionary.keys())[list(dictionary.values()).index('goat')]
    print('"goat" behind the door '+str(goat_key)) 

    '''
        选手选择是否更换为第三扇门
    '''
    del[dictionary[int(goat_key)]]
    # print(dictionary)
    second_key = dictionary.keys()
    # print(list(second_key)[0])
    choice = input('Switch to '+str(list(second_key)[0])+'?(y/n)')
    if(choice == 'y'):
        second_value = dictionary[list(second_key)[0]]
        if(second_value == 'car'):
            print('You Win!')
        else:
            print('You Lose!')
    if(choice == 'n'):
        if(first_value == 'car'):
            print('You Win!')
        else:
            print('You Lose!')
    
    return

3.利用while循环,调用函数,进行游戏。

game_body(game_initialize())
while(input('Do you want to try once more?(y/n)') == 'y'):
    game_body(game_initialize())

测试:

蒙蒂霍尔游戏Python 模拟蒙蒂霍尔悖论游戏_调用函数_02

三、源代码

import random

doors = [0,1,2]
gifts = ['goat','goat','car']
def game_initialize():
    random.shuffle(doors)
    random.shuffle(gifts)
    dic = dict(zip(doors,gifts))
    # print(dic)
    return dic

# game_initialize()

def game_body(dictionary):
    print('===================================')
    '''
        选手选择第一扇门
    '''
    first_key = input('Choose a door to open:')
    first_value = dictionary[int(first_key)]
    # print(first_value)

    '''
        主持人打开有goat的一扇门
    '''
    del[dictionary[int(first_key)]]
    # print(dictionary)
    goat_key = list(dictionary.keys())[list(dictionary.values()).index('goat')]
    print('"goat" behind the door '+str(goat_key)) 

    '''
        选手选择是否更换为第三扇门
    '''
    del[dictionary[int(goat_key)]]
    # print(dictionary)
    second_key = dictionary.keys()
    # print(list(second_key)[0])
    choice = input('Switch to '+str(list(second_key)[0])+'?(y/n)')
    if(choice == 'y'):
        second_value = dictionary[list(second_key)[0]]
        if(second_value == 'car'):
            print('You Win!')
        else:
            print('You Lose!')
    if(choice == 'n'):
        if(first_value == 'car'):
            print('You Win!')
        else:
            print('You Lose!')
    
    return


game_body(game_initialize())
while(input('Do you want to try once more?(y/n)') == 'y'):
    game_body(game_initialize())