蒙蒂·霍尔问题(三门问题)模拟-Python

关于三门问题的设定和相关讨论有很多,这篇比较详尽:
https://liam.page/2018/02/26/Monty-Hall-problem/
注意主持人打开的门一定是空的(是羊)!!!所以这个事件出现的概率是1,而不是2/3什么的。
我这里贴了一个小的python脚本,实践得真知,看看换门或者不换门得到汽车的最终概率是多少?

import random as rd


class Experiment:
    exp_count = 0

    def __init__(self, change=0):
        seq = [0, 1, 2]
        Experiment.exp_count += 1
        self.if_change = change

        # 随机构建序列,表示每个门后面有什么,1表示该门后面有车
        self.base = [0, 0, 0]
        self.base[rd.randint(0, 2)] = 1

        # (参与者)选择门
        self.choice = rd.randint(0, 2)

        # (主持人)选择门: 策略是选择其他两扇门中不是车的门,如果两个都不是车,随机选择一个
        seq.remove(self.choice)  # 从 0 ,1 ,2 门派号中移除掉参与者选的,供主持人选择
        for index in seq:
            if self.base[index] == 1:
                seq.remove(index)  # 主持人能选到车的话,移除这个选择(选择另一扇门)
                break
        if len(seq) == 1:
            self.choice_host = seq[0]
        else:
            self.choice_host = rd.choice(seq)
        self.sucess = 0

    def start(self):

        if self.if_change ==0:  # 如果不交换
            if self.base[self.choice] == 1:
                self.sucess = 1
            else:
                self.sucess = 0

        if self.if_change == 1:  # 如果交换
            seq = [0, 1, 2]
            seq.remove(self.choice)
            seq.remove(self.choice_host)
            cur_choice = seq[0]
            if self.base[cur_choice] == 1:
                self.sucess = 1
            else:
                self.sucess = 0


def main():
    success_count = 0
    for i in range(10000000):  # 实验次数
        x = Experiment(change=1)  # 默认不交换,change = 1 交换
        x.start()
        if x.sucess == 1:
            success_count += 1

    print(success_count / Experiment.exp_count)  # 打印成功拿到车的概率


main()

简单实验两次,如果按照游戏的规则,主持人始终会打开一扇没有车的门,则不换的时候最终得到车的概率约为1/3,换的时候得到的概率为2/3。

你可能感兴趣的:(Python)