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






