著名的“三门问题”的验证

2023-05-16

啥是三门问题

三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论。

下面是题目的内容:

“假设你正在参加一个游戏节目,你被要求在三扇门中选择一扇:其中一扇后面有一辆车;其余两扇后面则是山羊。你选择了一道门,假设是一号门,然后知道门后面有什么的主持人,开启了另一扇后面有山羊的门,假设是三号门。他然后问你:“你想选择二号门吗?”

在这个题目中,选中汽车奖品就是汽车,选中山羊奖品就是山羊,大部分参与者都希望自己选中汽车。

那么在主持人问你之后,你会改变自己最开始选择的门吗?会从一号门选择二号门吗?

你也许会疑问,这有什么好纠结的,换不换不是一样的吗?

其实这个问题本质是:换另一扇门是否会增加参赛者赢得汽车的概率?

如果严格按照上述题目的条件,即主持人清楚地帮你打开了一扇背后是山羊的门,那么答案是:会。不换门的话,赢得汽车的几率是1/3。换门的话,赢得汽车的几率是2/3。

虽然该问题的答案在逻辑上并不自相矛盾,但十分违反直觉。所以这个问题曾引起一阵热烈的讨论。

逻辑上的解释

现在给你两种方案:
第一种,你选择一扇门,然后坚定不移的打开它,如果它有汽车,那么你中奖了
第二种,你选择一扇门,然后排除此门打开另外两道门,如果打开的两道门中有汽车,那么你中奖了。

聪明如你,肯定体会到了这两种方案的差异。
其实不换门,就是第一种方案,而换门,就等同于你采用了第二种方案。

画图来说明

在这里插入图片描述
从图中显而易见的看出,当你改变选择时,有三分之二的机会得到汽车,否则,有三分之二的机会得到山羊。

通过程序来验证

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" />
    <meta name="apple-mobile-web-app-capable" content="yes" />
    <meta name="apple-mobile-web-app-status-bar-style" content="black" />
    <meta name="x5-orientation" content="landscape" />
    <meta name="x5-fullscreen" content="true" />
    <meta name="screen-orientation" content="landscape" />
    <meta name="full-screen" content="true" />
    <meta name="viewport" content="uc-fitscreen=yes" />
    <meta name="nightmode" content="disable" />
    <title>三门问题验证</title>
    <style>
    html,
    body {
        font-size: 100px;
        height: 100%;
    }

    #app {
        height: 6rem;
        font-size: 0.4rem;
        text-align: center;
        display: flex;
    }

    button {
        font-size: 1rem;
        background-color: #0f0;
        margin: auto;
        border-radius: 8px;
    }
    </style>
</head>

<body>
    <div style="text-align:center">验证三门问题</div>
    <div id="app">
        <button onclick="init()">click ME !!!</button>
    </div>
</body>
<script>
var n = 10000,
    win = 0,
    lose = 0,
    doors = null,
    chooseIndex = NaN,
    leftDoor = NaN;

function random(ind) {
    return Math.floor(Math.random() * ind)
}

function randerDoors() { // 随机在一个门后放置汽车
    doors = (new Array(3)).fill(false) // 初始化门后全部是山羊
    var ind = random(3)
    doors[ind] = true
}

function chooseDoors() { // 参与者随机选择一扇门
    chooseIndex = random(2)
}

function openDoors() { // 主持人随机打开一扇门
    if (doors[chooseIndex]) { // 如果参与者第一次选中的汽车
        const ind = random(2)
        leftDoor = (chooseIndex + ind) % 3 // 剩下的那个门的索引
        lose++
    } else { // 如果参与者第一次选中的山羊
        if (doors[(chooseIndex + 1) % 3]) {
            leftDoor = (chooseIndex + 1) % 3
        } else {
            leftDoor = (chooseIndex + 2) % 3
        }
        win++
    }

}
var el = document.getElementById('app')

function init() {
    for (var i = 0; i < n; i++) {
        randerDoors()
        chooseDoors()
        openDoors()
    }
    el.innerHTML = '<p>You have win <strong>' + win + '</strong> cars and <strong>' + lose + '</strong> sheep</p>'
}
</script>

</html>

注释写的很清楚,大家把代码复制到本地,就可以在浏览器打开看结果了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

著名的“三门问题”的验证 的相关文章

随机推荐