起因
无意间看到三门问题,然后了解了一下,大致内容如下:
一个游戏,有三扇门,一真两假,假门背后是空的,真门背后是奖品,如果选中真门那就能获得奖品,选中假门那没有奖品,当玩家开始选中一扇门之后,主持人会在剩下的两扇门中打开一扇假门,此时玩家能够获得重新选择的权力,那么换一扇门获得奖品的概率高还是不换获得奖品的概率高。
答案是不换获得奖品的概率为1/3,换门获得奖品的概率为2/3。
经过
看到这个答案,起初表示十分不能理解,因为这和我想的不一样,我认为换门和不换门的概率应该是一样的,实践出真知,所以我决定用代码来实现看看
function main(total, changeFlag) {
var doors, // 表示门的数组
trueNum, // 表示真门的位置
choseDoor, // 表示玩家选择的门
exculdeNum // 表示主持人排除的假门
// 两扇假门
doors = ['false', 'false']
// 真门位置
trueNum = getRandom(0, 2)
// 插入真门
doors.splice(trueNum, 0, 'true')
// 选择的门
choseDoor = doors.splice(getRandom(0, 2), 1)
// 剩下两扇门中排除一扇假门
if (doors[0] === doors[1]) {
exculdeNum = getRandom(0, 1)
} else {
exculdeNum = doors.findIndex(function(item) {
return item === 'false'
})
}
doors.splice(exculdeNum, 1)
// 是否换门
if (changeFlag) {
return doors[0]
} else {
return choseDoor[0]
}
}
function getRandom(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min)
}
function test() {
var total = 100000,
count = 0,
changeTotal = 0,
notChangeTotal = 0
while (count < total) {
if (main(0, true) === 'true') {
changeTotal++
}
if (main(0, false) === 'true') {
notChangeTotal++
}
count++
}
console.log("不换门:" + notChangeTotal)
console.log('换门:' + changeTotal);
}
test()
数据量为十万,测试了多次,结果不换门得到正确结果的次数一般为33000多,换门得到正确结果的次数一般为66000多,显然,换门成功的概率的确是2/3,不换门成功的概率是1/3。
结果
为什么呢?想了一会,结合百度到的一些内容,想明白了。
之前想的角度不对,之前以为是两次选择,第一次选择时每扇门概率都相同,主持人帮你排除了一扇门后,第二次选择换还是不换好像并不会影响自己门后面会不会有奖品,所以概率好像还是都相同。
正确的看法应该是把三扇门分两组,A组是第一次选的,只有一扇门,B组是没选的两扇门,因为主持人会帮你在B组中去掉一个错误选项,所以选择B组的话赢得奖品的概率当然是2/3啊。