今天又见到这个智力问题了:
假设你参加了一个游戏节目,现在要从三个密封的箱子中选择一个。其中两个箱子是空的,另一个箱子里面有大奖(你偶像的签名^^)。你并不知道奖在哪一个箱
子里,但主持人知道。游戏节目的主持人先要你选择一个箱子,接着他把你没有选的空箱子打开,以证明它是空的。最后主持人给你换箱子的机会,你可以把你所选
择的箱子换成另一个没有打开的箱子。此时你该不该换箱子?
我的直觉告诉我,换与不换概率都是1/2.因为没有选择的那两个箱子里必定至少有一个是空的,这是个确定事件,所以,无论是否把它纠出来,对我的选择的
正确率都是没有影响的.而主持人指出那个空箱子的过程,那个箱子是正确的概率就应该平均分布到剩下的两个箱子中去了--概率他老人家应该是公平的吧,大概
不会偏向某一个箱子吧:)
回答这个问题的大致分为两派,一派选换,一派选不换(废话嘛,就俩答案...),我对自己的答案颇有信心,但在说服不同意见者方面没有多少信心--大家也知道,网上争吵一般是不会出现什么结果的,于是就写了段代码,让程序说话:
Program.cs
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;
}
}
}
Game.cs
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;
}
}
}
}
Choice.cs
namespace SureNoChange
{
enum Choice
{
A,
B,
C,
}
}
但是,结果却是:
Wins after change decision: 66924/100000
Wins without change decision: 35009/100000
晕了,我的直觉居然错了!更改选择的话,得到奖品的可能性是2/3,不改的话,是1/3!
如果对这个宏观的"概率坍缩"的直觉都能犯这么大的错误,那些搞量子物理的,一再被实验结果打击,岂不会疯掉...