1. 程式人生 > 其它 >Python 模仿三門選一,選手重選的貝葉斯遊戲

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