python模拟报数游戏_蒙提霍尔游戏 python 模拟

本文使用蒙特卡罗方法验证蒙提霍尔游戏的结论。

以下代码,本人原创!

完整代码

import random

# 蒙提霍尔游戏

def play_game(strategy='nonchange'):

# 门牌编号

doors = [0,1,2]

# 门后的奖品

gifts = ['goat', 'goat', 'car']

random.shuffle(gifts)

# 观众挑选一扇门(编号)

viewer_choice = random.choice(doors)

# 主持人从剩下的两扇门中,打开门后是是山羊的某一扇门(编号)

host_open = random.choice(list(filter(lambda x:gifts[x]=='goat' and x!=viewer_choice, doors)))

# 顺便,也标记剩下的一扇门(编号)

viewer_lift = list(filter(lambda x:x!=viewer_choice and x!=host_open, doors))[0]

# 观众根据策略获得的奖品

viewer_gift = [gifts[viewer_choice], gifts[viewer_lift]][strategy=='change']

# 根据策略成功与否,返回 1、0 (为方便计数)

return [0, 1][viewer_gift=='car']

# 游戏次数

n = 10000

# 蒙特卡罗方法,模拟 n 次游戏

# 策略一:不改变选择

p = sum((play_game('nonchange') for _ in range(n))) / n # 频率 ≈ 概率

print('nonchange:', p)

# 蒙特卡罗方法,模拟 n 次游戏

# 策略二:改变选择

p = sum((play_game('change') for _ in range(n))) / n # 频率 ≈ 概率

print('change:', p)

效果图

61b50f1decc005c8774683d438648ce3.png


版权声明:本文为weixin_36048512原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。