本智力题得名于一位美国电视游戏节目的主持人蒙特,他曾在多年之前主持一档档名为成交的节目。在其中的一个游戏中,Monty向竞猜者展示了三扇门。有一扇门之后是一辆小轿车。另两扇门之后是空房间。蒙特事先知道门后是什么,但您并不知道。而你的目的就是要选中有车的那个门。 
游戏分为三步: 
1. 您选择一扇门。 
2. 蒙特将会打开剩余的两扇门中的一扇,展示一个空的房间。(他从不会打开那扇后面藏有汽车的。) 
3. 然后您可以选择是仍然选择在步骤1中选择的那扇门,还是选择去打开另一扇仍然关闭的。 
假定您选择了A门。然后蒙特打开了另两扇门中的一扇,假定为B门。现在您可以选择改选C门或者仍然坚持最初的选择,即A门。如果没有改变选择,那么可能会猜对也可能会猜错。另一方面,如果您改选C门,则还是既可能猜对也可能猜错。您会做出什么选择呢?在蒙特打开一扇门之后,是坚持最初的选择,还是改变前面已做的选择呢?为什么呢? 这题目看起来简单,其实不然,其中有个概率悖论,大家请看:
1、假如完全不理会蒙特的动作,坚持自己的选择,那么其实就是3选1,成功率应该是33.3%;
2、无论如何,最后一定剩下两扇门有得选,改不改变选择都一样,那成功率应该是50%;
3、如果不改变选择,成功率是33%,如1所言,那有车的门在另外两扇门中的概率是66.7%,现在又知道了两扇门中的一扇是没有车的,于是选另一扇门成功几率就是66.7%;这3种说法都是有道理的,究竟谁对谁错?

解决方案 »

  1.   

    这题目不能想当然,大家看看我的程序:#include "stdafx.h"
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>#define RETRY_COUNT 10000char Rand123()
    {
    int rnum = rand();
    if (rnum<10922)
    return 1;
    if (rnum<21844)
    return 2;
    return 3;
    }int main(int argc, char* argv[])
    {
    srand(time(NULL)); int iSuccess = 0; for(int i=0; i<RETRY_COUNT; i++)
    { //The door with car
    char cDoorCar = Rand123(); //The player's choice
    char cPlayerChoice = Rand123(); //The door Monty opens
    char cMonty;
    for(cMonty=1; cMonty<=3; cMonty++)
    {
    if (cMonty!=cDoorCar && cMonty!=cPlayerChoice)
    break;
    } //If the player doesn't change his/her choice
    //if (cDoorCar==cPlayerChoice)
    // iSuccess++; //If the player always changes his choice
    char cChanged;
    for(cChanged=1; cChanged<=3; cChanged++)
    {
    if (cChanged!=cPlayerChoice && cChanged!=cMonty)
    break;
    }
    if(cDoorCar==cChanged)
    iSuccess++;
    } printf("Succeeded: %d/%d\n", iSuccess, RETRY_COUNT);
    return 0;
    }如果我理解没有错的话,3是正确答案,玩家应改变自己的选择来赢得更高成功率。
      

  2.   

    1.我们的初次选择其实没有意义,我们应该忽略的是我们第一次选择,因为没有任何一个傻瓜会在Monty开门之前作决定,如果一定要采取傻瓜的举动,当然可靠性只有33.3%,但是这是因为傻而不是悖论导致低概率2. 这是正确选择
    3. 这就是条件概率了。没有任何悖论。在MOnty打开门之后,剩余两扇门的概率不再是33%了,所以“成功率是33%”的正确性只有在Monty打开B之前正确,打开后就不正确了。实际上打开A此时概率是50%,而不是33%
    所以这不是悖论,只是忽略了“条件概率”这个概念导致的思维混乱