问题描述
奖品随机分布在3扇门后,客户随机选择其中一扇,主持人打开另外两扇中任意没有奖品的一扇,问客户选择以下哪种策略赢面更大:
1.坚持原来的选择
2.改选剩下的那扇未打开的门
说实话,就算我跑出来结果也想不通为什么。不多废话了,上代码。
代码
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 13 17:41:35 2023
@author: sixing liu
"""
from numpy import random
import pandas as pd
class Game:
"""
定义三门游戏
"""
def __init__(self):
'''
准备奖池
'''
pool = [True, False, False] # 奖池中有一个奖品,并由True标记
random.shuffle(pool) # 打乱奖池
pool = pd.DataFrame(pool, columns=['Prize']) # 门序号是pool.index
self.pool = pool
def choice_1st(self):
'''
第一次选择
'''
self.choice1 = random.randint(0, 2) # 在[0, 1, 2] 中随意选择一个数字
# print('Your first choice is {}'.format(self.choice1))
self.choice = self.choice1
def host_drop(self):
'''
主持人环节,在你选择的序号以外,从奖池中去掉一个非奖品(FALSE)
'''
pool_host = self.pool.drop(self.choice1) # 主持人看到的奖池
choice_host = pool_host[pool_host['Prize'] == False].index[0] # 主持人的选择
self.pool = self.pool.drop(choice_host) # 剩下的奖池
# print('Host has drop')
def choice_2st(self, switch=True):
'''
第二次选择,
如果你选择更换第一次的选择,则swith = True
保持第一次的选择,则swith = False
'''
choices = list(self.pool.index)
if switch:
# 更换选择
choices.remove(self.choice1)
self.choice2 = choices[0]
else:
self.choice2 = self.choice1 # 保持选择
# print('Your second choice is {}'.format(self.choice2))
self.choice = self.choice2
def prize(self):
'''
你的奖品
'''
return self.pool.loc[self.choice, 'Prize']
def play(switch: bool):
game = Game() # 开始游戏,创建奖池
game.choice_1st() # 你的回合,抽卡!
game.host_drop() # 主持人的回合, 奖池有些不一样了
game.choice_2st(switch) # 你的回合,“生存还是死亡是一个问题”
prize = game.prize() # 来看一看你得到了什么狗shit吧
return prize
# 这样的结果,说实话,我不李姐
ps = []
for i in range(1000):
p = play(switch=True)
# p = play(switch=False)
ps.append(p)
ps = pd.Series(ps)
prob = len(ps[ps == True]) / len(ps) # 换门的概率约为0.66 (TMD还是想不通)
直接复制就可以运行。代码本身还是很容易理解的。