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

三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let’s Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门会否增加参赛者赢得汽车的机率?如果严格按照上述的条件,即主持人清楚地知道,自己打开的那扇门后是羊,那么答案是会。不换门的话,赢得汽车的几率是1/3。换门的话,赢得汽车的几率是2/3。
这个问题亦被叫做蒙提霍尔悖论:虽然该问题的答案在逻辑上并不自相矛盾,但十分违反直觉。这问题曾引起一阵热烈的讨论。
解析:
使用蒙特卡洛算法模拟,意思是在多次尝试以后,如果得出不换门的话,赢得汽车的几率是1/3; 换门的话,赢得汽车的几率是2/3,则表明该结论成立.
代码:

package Test;

public class ThreeGatesExperiment {

    private int N;

    public ThreeGatesExperiment(int N) {

        if (N <= 0)
            throw new IllegalArgumentException("N must be larger than 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 ? "Change" : "Not Change");
        System.out.println("winning rate: " + (double) wins / N);
    }

    private boolean play(boolean changeDoor) {

        // Door 0, 1, 2
        int prizeDoor = (int) (Math.random() * 3);
        int playerChoice = (int) (Math.random() * 3);

        if (playerChoice == prizeDoor)
            return changeDoor ? false : true;
        else
            return changeDoor ? true : false;
    }

    public static void main(String[] args) {

        int N = 10000000;
        ThreeGatesExperiment exp = new ThreeGatesExperiment(N);

        exp.run(true);
        System.out.println();
        exp.run(false);
    }
}

运行结果:

Change
winning rate: 0.6668102

Not Change
winning rate: 0.3333677

可见,换门和不换门中奖的概率接近2:1,由此得出该结论成立.
以上是通过蒙特卡洛方法模拟出来的结果,下面通过数学思想来解释.
在这里插入图片描述

在这里插入图片描述
可以看出换门,成功率是失败率的两倍;不换门,失败率是成功率的两倍.
由此可见换门还是有更好的效果,究其原因是因为主持人清楚地知道,自己打开的那扇门后是羊而不会是车,这并不是随机的事件,而是确定的.

你可能感兴趣的:(计算机与概率统计,算法,蒙特卡洛算法,Java学习之路)