Python 模仿三門選一,選手重選的貝葉斯遊戲
阿新 • • 發佈:2021-08-22
背景
某抽獎節目,設定三扇大門,其中只有一扇大門後面有獎品汽車一輛,其他後面都空。選手選擇其中一扇門,主持人再其他兩扇門中任意開啟一扇背後是空的門,問選手是否更改自己的選擇。理性的選擇是更改選擇。實驗如下。
程式碼
所用函式
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倍。