Python 模仿三门选一,选手重选的贝叶斯游戏
背景
某抽奖节目,设置三扇大门,其中只有一扇大门后面有奖品汽车一辆,其他后面都空。选手选择其中一扇门,主持人再其他两扇门中任意打开一扇背后是空的门,问选手是否更改自己的选择。理性的选择是更改选择。实验如下。
代码
所用函数
import random
def gen():
a=[0,0,0]
a[random.randint(1,3)-1]=1
return a
def check(problem, answer):
return 1 if 2 in [i+j for i,j in zip(problem, answer)] else 0
def reveal(problem:list, answer:list):
c=[i+j for i,j in zip(problem,answer)]
new_problem=problem.copy()
new_problem[c.index(0)]=-1
return new_problem
def re_choose(problem:list, answer:list):
setall=set([0,1,2])
used_set=set([ problem.index(-1),answer.index(1)])
new_answer=[0,0,0]
new_answer[setall.difference(used_set).pop()]=1
return new_answer
- gen: 用于生成随机列表,表示三扇门,[0,0,1] 表示第三扇门后面有奖品,或选手第一次选择,[1,0,0] 表示选手选择第一扇门。
- check: 用于核对选手结果和正确答案,对1错0
- reveal: 用于模仿主持人揭开一扇门,置为-1.
- re_choose: 用于模仿选手做诸人吃打开一扇空门后选择另一扇门。
模拟
origin_answer_list=[]
new_answer_list=[]
n=10000
for i in range(1,n):
problem = gen()
origin_answer = gen()
origin_score = check(problem=problem,answer=origin_answer)
new_problem = reveal(problem=problem,answer=origin_answer)
new_answer = re_choose(problem=new_problem, answer=origin_answer)
new_score = check(problem=problem, answer=new_answer)
origin_answer_list.append(origin_score)
new_answer_list.append(new_score)
print('默认答案:'+str(round(sum(origin_answer_list)/n*100,3))+'%')
print('新的答案:'+str(round(sum(new_answer_list)/n*100,3))+'%')
结果是:
- 默认答案:32.67%
- 新的答案:67.32%
在主持人打开一扇门后,选择另一扇门,是维持第一次选择的门获得奖品的概率2倍。