蒙提·霍尔悖论(三门问题)理解分析

蒙提·霍尔悖论(三门问题)理解分析,第1张

蒙提·霍尔悖论(三门问题)
  • 介绍
  • 游戏规则
  • 理解分析
    • 理解分析一
    • 理解分析二
    • 理解分析三
    • 理解分析四
  • 用编程验证
    • Python
    • Java

介绍

蒙提霍尔悖论亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论、三门问题(Monty Hall problem)。是一个源自博弈论的数学游戏问题,大致出自美国的电视游戏节目Let’s Make a Deal。问题的名字来自该节目的主持人蒙提·霍尔(Monty Hall)。

游戏规则
  1. 参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门就可以赢得该汽车,而另外两扇门后面则各藏有一只山羊。
  2. 当参赛者选定了一扇门,但未去开启它的时候,节目主持人会开启剩下两扇门的其中一扇,露出其中一只山羊。
  3. 主持人其后会问参赛者要不要换另一扇仍然关上的门。
理解分析 理解分析一
情景不换
选中了有车的门
选中了有羊(A)的门
选中了有羊(B)的门

结论: 换赢的概率为2/3,不换赢的概率为1/3

理解分析二

初选时你获胜的概率是1/3,如果你不换,你的概率一直都是1/3,那个剩下的就是2/3。

理解分析三

可以将之理解为抽奖游戏,假设奖池有3个卡片(只有一个中奖),A抽了一个,剩下给B抽了。
这时,A中奖的概率是1/3,而B中奖的概率为2/3。B不会因为发现有一个卡片没有中奖而概率会变化。

理解分析四

例如一群人在玩抽奖游戏,每个人都抽奖了,但是开奖的顺序是不同的,你不会因为前面有人开奖不中自己中奖的概率就会改变,当你抽到奖的时候你的中奖概率就固定不变了,只是感官直觉上觉得变了。

用编程验证 Python
import random


def play(change_door):
    # 随机从【1,2, 3】中选一个做为正确答案(车)
    prize_door = random.randint(1, 3)
    # 模拟参赛者从【1,2, 3】中选一个
    player_choice = random.randint(1, 3)

    if prize_door is player_choice:
        return False if change_door else True  # 参赛者选择换的时候
    else:
        return True if change_door else False  # 参赛者选择不换的时候


def three_door(N, change_door):
    if N < 0:
        print('请输入大于0的参数')
        return
    wins = 0
    for i in range(0, N):
        if play(change_door):
            wins += 1

    print("换" if change_door else "不换")
    print(f"赢的概率:{wins / N}")


if __name__ == '__main__':
    N = 100000
    three_door(N, True)  # 参赛者选择换
    three_door(N, False)  # 参赛者选择不换

Java
public class ThreeDoor {

    private int N;
    public ThreeDoor(int N) {
        if (N <= 0)
            throw new IllegalArgumentException("请输入大于0的参数");
        this.N = N;
    }

    public void run(boolean changeDoor) {
        int wins = 0;
        for (int i = 0; i < N; i++)
            if (play(changeDoor))
                wins++;

        System.out.println(changeDoor ? "换" : "不换");
        System.out.println("赢的概率: " + (double) wins / N);
    }

    private boolean play(boolean changeDoor) {
        // 随机从【1,2, 3】中选一个做为正确答案(车)
        int prizeDoor = (int) (Math.random() * 3 + 1);
        // 模拟参赛者从【1,2, 3】中选一个
        int playerChoice = (int) (Math.random() * 3 + 1);

        if (playerChoice == prizeDoor)
            return changeDoor ? false : true;  // 参赛者选择换的时候
        else
            return changeDoor ? true : false;  // 参赛者选择不换的时候
    }

    public static void main(String[] args) {

        int N = 1000000;   // 迭代验证次数
        ThreeDoor exp = new ThreeDoor(N);

        exp.run(true);  // 参赛者选择换
        exp.run(false);  // 参赛者选择不换
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/795665.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存