论坛首页 海阔天空论坛

关于直觉是否可靠..

浏览 2392 次
精华帖 (0) :: 良好帖 (0) :: 灌水帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-02-05  
今天又见到这个智力问题了:

假设你参加了一个游戏节目,现在要从三个密封的箱子中选择一个。其中两个箱子是空的,另一个箱子里面有大奖(你偶像的签名^^)。你并不知道奖在哪一个箱子里,但主持人知道。游戏节目的主持人先要你选择一个箱子,接着他把你没有选的空箱子打开,以证明它是空的。最后主持人给你换箱子的机会,你可以把你所选择的箱子换成另一个没有打开的箱子。此时你该不该换箱子?


我的直觉告诉我,换与不换概率都是1/2.因为没有选择的那两个箱子里必定至少有一个是空的,这是个确定事件,所以,无论是否把它拿纠出来,对我的选择的正确率都是没有影响的.而主持人指出那个空箱子的过程,那个箱子是正确的概率就应该平均分布到剩下的两个箱子中去了--概率他老人家应该是公平的吧,大概不会偏向某一个箱子吧:)

回答这个问题的大致分为两派,一派选换,一派选不换(废话嘛,就俩答案...),我对自己的答案颇有信心,但在说服不同意见者方面没有多少信心--大家也知道,网上争吵一般是不会出现什么结果的,于是就写了段代码,让程序说话:

using System;

namespace SureNoChange
{
    class Program
    {
        static void Main(string[] args)
        {
            int timesToTry = 100000;

            int winsWithChange = SimulateChange(timesToTry);
            Console.WriteLine("Wins after change decision: {0}/{1}", winsWithChange, timesToTry);

            int winsWithOutChange = SimulateNoChange(timesToTry);
            Console.WriteLine("Wins without change decision: {0}/{1}", winsWithOutChange, timesToTry);

            Console.ReadKey();
        }

        private static int SimulateChange(int timesToTry)
        {
            int timesWin = 0;
            for (int i = 0; i < timesToTry; i++)
            {
                Game game = new Game();
                game.PlayerSelectAnOption();
                game.RemoveOneWrongOption();
                game.ChangeChoice();

                if (game.Win)
                {
                    timesWin++;
                }
            }
            return timesWin;
        }

        private static int SimulateNoChange(int timesToTry)
        {
            int timesWin = 0;

            for (int i = 0; i < timesToTry; i++)
            {
                Game game = new Game();
                game.PlayerSelectAnOption();
                game.RemoveOneWrongOption();
                if (game.Win)
                {
                    timesWin++;
                }
            }
            return timesWin;
        }
    }
}



namespace SureNoChange
{
    enum Choice
    {
        A,
        B,
        C,
    }
}



using System;
using System.Collections.Generic;

namespace SureNoChange
{
    class Game
    {
        Random r;
        Choice prize;
        Choice choice;
        Choice open;

        public Game()
        {
            r = new Random();
            prize = GetRandomChoice();
        }

        /// <summary>
        /// 玩家随机选择一个箱子
        /// </summary>
        internal void PlayerSelectAnOption()
        {
            choice = GetRandomChoice();
        }

        /// <summary>
        /// 从未被选择的,不是答案的箱子里打开一个
        /// </summary>
        internal void RemoveOneWrongOption()
        {
            List<Choice> openable = new List<Choice>();
            openable.AddRange(AllChoices);

            openable.Remove(choice);
            openable.Remove(prize);

            open = openable[r.Next(openable.Count)];
        }

        private Choice GetRandomChoice()
        {
            return AllChoices[r.Next(3)];
        }

        /// <summary>
        /// 从先前选择的,打开的箱子以外的所有箱子里再随机选择一个
        /// </summary>
        internal void ChangeChoice()
        {
            List<Choice> rest = new List<Choice>();
            rest.AddRange(AllChoices);

            rest.Remove(open);
            rest.Remove(choice);

            Choice newChoice = rest[r.Next(rest.Count)];
            choice = newChoice;
        }

        internal bool Win
        {
            get
            {
                return choice == prize;
            }
        }

        static List<Choice> allChoices;
        static List<Choice> AllChoices
        {
            get
            {
                if (allChoices == null)
                {
                    allChoices = new List<Choice>();
                    allChoices.AddRange((Choice[])Enum.GetValues(typeof(Choice)));
                }
                return allChoices;
            }
        }
    }
}


但是,结果却是:

引用
Wins after change decision: 66924/100000
Wins without change decision: 35009/100000


晕了,我的直觉居然错了!更改选择的话,得到奖品的可能性是2/3,不改的话,是1/3!

如果对这个宏观的"概率坍缩"的直觉都能犯这么大的错误,那些搞量子物理的,一再被实验结果打击,岂不会疯掉...
   发表时间:2008-02-06  
不是“直觉”,而是“错觉”。

因为主持人在两个里面打开一个空箱子这件事是确定的100%概率时间,你可以这样想:

现在左边一个箱子,右面两个。假如我告诉你,如果你选两个箱子的话,我会免费帮你打开一个空箱子来减少你选错的机会,你选左边还是右边?
0 请登录后投票
   发表时间:2008-02-06  
想了一下,关键是"主持人知道哪个箱子里边有奖品",如果他不知道,随便拿走一个箱子的话,换与不换确实一个样.

但是我觉得"直觉"就是直觉,不管正确的还是错误的.
0 请登录后投票
   发表时间:2008-02-06  
就标题而言
直觉是不可靠的
如果内容和标题不符合
就叫标题党~
0 请登录后投票
论坛首页 海阔天空版

跳转论坛:
Global site tag (gtag.js) - Google Analytics