zoukankan      html  css  js  c++  java
  • 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倍。

  • 相关阅读:
    2018.6.8 现代企业管理复习总结
    写时复制
    字符串类示例
    信号量示例
    对象赋值的语义
    对象复制的语义
    无用单元和悬挂引用
    初始化
    静态数据成员,静态成员函数
    同时找出最大数和最小数
  • 原文地址:https://www.cnblogs.com/heenhui2016/p/15171879.html
Copyright © 2011-2022 走看看