美文网首页
三门问题编程验证(js)

三门问题编程验证(js)

作者: 叁乘拾的捌次方 | 来源:发表于2019-06-25 19:05 被阅读0次

    三门问题,亦称为蒙特霍尔(英文: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<gameCount; i++){
      if(game(true)){
        changeCount++;
      }
      if(game(false)){
        notChangeCount++;
      }
    }
    //最后的结果
    const p1=changeCount/gameCount  //更换选择,抽中的概率,大约是2/3
    const p2=notChangeCount/gameCount  //不更换选择,抽中的概率,大约是1/3
    console.log("更换选择,抽中的概率为:"+p1);
    console.log("不更换选择,抽中的概率为:"+p2);
    

    相关文章

      网友评论

          本文标题:三门问题编程验证(js)

          本文链接:https://www.haomeiwen.com/subject/bkgxcctx.html