三门问题的JavaScript实现

起因

无意间看到三门问题,然后了解了一下,大致内容如下:
一个游戏,有三扇门,一真两假,假门背后是空的,真门背后是奖品,如果选中真门那就能获得奖品,选中假门那没有奖品,当玩家开始选中一扇门之后,主持人会在剩下的两扇门中打开一扇假门,此时玩家能够获得重新选择的权力,那么换一扇门获得奖品的概率高还是不换获得奖品的概率高。
答案是不换获得奖品的概率为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啊。

你可能感兴趣的:(三门问题的JavaScript实现)