浏览 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! 如果对这个宏观的"概率坍缩"的直觉都能犯这么大的错误,那些搞量子物理的,一再被实验结果打击,岂不会疯掉... 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-02-06
不是“直觉”,而是“错觉”。
因为主持人在两个里面打开一个空箱子这件事是确定的100%概率时间,你可以这样想: 现在左边一个箱子,右面两个。假如我告诉你,如果你选两个箱子的话,我会免费帮你打开一个空箱子来减少你选错的机会,你选左边还是右边? |
|
返回顶楼 | |
发表时间:2008-02-06
想了一下,关键是"主持人知道哪个箱子里边有奖品",如果他不知道,随便拿走一个箱子的话,换与不换确实一个样.
但是我觉得"直觉"就是直觉,不管正确的还是错误的. |
|
返回顶楼 | |
发表时间:2008-02-06
就标题而言
直觉是不可靠的 如果内容和标题不符合 就叫标题党~ |
|
返回顶楼 | |