三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let’s Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门是否会增加参赛者赢得汽车的机率。如果严格按照上述的条件,那么答案是会。不换门的话,赢得汽车的几率是1/3。换门的话,赢得汽车的几率是2/3。
/** * 单次测试模拟 * @param isHeGod 主持人是否知道答案,true为知道,false为不知道 * @returns {number} 0:换另一个选项,1:坚持原选项,2:主持人选中 */ functionutest(isHeGod) { // 题目生成 let door = createDoor(); // 我随机选 let ichoose = random(0, 3); // 主持人随机选 let hechoose = (ichoose + 1) % 3; // 如果他知情的话就不选中奖的门 if (isHeGod) { for (let i = 0; i < door.length; i++) { if (i === ichoose) continue if (!door[i]) { hechoose = i; break; } } }
// 返回结果 if (door[hechoose]) { return2 } else { if (!door[ichoose]) { return0 } else { return1 } } }
/** * 大量测试 */ functionrun() { let isHeGod = true; console.log('isHeGod => ', isHeGod); let total = 10e6 // a:换另一个选项,b:坚持原选项,c:主持人选中 let a = b = c = 0; for (let i = 0; i < total; i++) { let res = utest(isHeGod) switch (res) { case0: a += 1; break; case1: b += 1; break; case2: c += 1; break; } } console.log({ total, a, b, c }) }