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倍。

posted @ 2021-08-22 12:11  何大卫  阅读(250)  评论(1编辑  收藏  举报