三门问题编程验证(js)

三门问题,亦称为蒙特霍尔(英文:Monty Hall problem),源自博弈论的数学游戏问题。这个游戏的玩法是:
参赛者会看见三扇关闭了的门,其中一扇的后面是奖品,而另外两扇门后面没有任何东西。
第一步,参赛者先选定了一扇门,但未去开启它,
第二步,知道门后情形的节目主持人会开启剩下两扇门的其中一扇空门,
第三步,主持人会问参赛者要不要换另一扇仍然关上的门。
现在问题是:换另一扇门会否增加参赛者赢得奖品的概率?如果换的话,那么他赢得奖品的概率是多少?

我一开始看这个问题的时候,以为如果选择换的话,那么他中奖的概率将由原来的1/3上升为1/2。
可是最后的结论是:如果参赛者更换选择的话,那么他中奖的概率是2/3。

数学证明:

这里我们将用到高中时候学到的贝叶斯公式:


20180310163119205.png

P(B|A):在A发生的前提下,B发生的概率
P(A|B):在B发生的前提下,A发生的概率
P(A):A发生的概率,在这里指主持人打开空门的概率
P(B):B发生的概率,在这里指选中奖品的概率,很显然为1/3

因为主持人知道每扇门的后面是什么,所以主持人肯定能打开空门,所以P(A)=1,P(A|B)=1。
我们将数值带入贝叶斯公式便可得出结果:在主持人打开空门之后,参赛者不更换选择,选中的奖品的概率为P(B|A)=1/3。所以更换选择的概率为1-1/3=2/3。

下面是编程验证:

//生成min到max之间的随机整数
function randomInt(min,max){
  return Math.floor(Math.random()*(max-min+1));
}
function game(ifChange){
  const prize=randomInt(0,2);   //奖品
  let custSelect=randomInt(0,2);   //玩家的第一次选择
  let hostSelect;   //主持人的选择
  //主持人会选中没有奖品的门
  if(custSelect==prize){
    hostSelect=[0,1,2].find(item=>item!=prize);
  }
  else{
    hostSelect=[0,1,2].find(item=>item!=prize&&item!=custSelect);
  }
  //是否更换选择
  if(ifChange){    //更换选择
    custSelect=[0,1,2].find(item=>item!=hostSelect&&item!=custSelect);
  }
  return custSelect==prize;   //返回是否中奖
}
​
const gameCount=3000;  //执行次数
let changeCount=0;   //换之后的中奖次数
let notChangeCount=0;   //坚持原来的选择的中奖次数
for(let i=0; i

你可能感兴趣的:(三门问题编程验证(js))