读书人

看到一个老掉牙题进来求解

发布时间: 2014-01-05 18:22:56 作者: rapoo

看到一个老题,进来求解
你参加一个抽奖活动,桌上放着3个一摸一样的盒子,主持人告诉你其中有且只有一个盒子里有奖品,别的两个都是空的,你可以从中选择一个盒子打开。你随意选了一个盒子,在你打开盒子之前,主持人打开了另外两个盒子中的一个,并展示给你看,里面是空的。主持人说此时你还有一次机会可以换成选择你没有选也没有被打开的那个盒子,你要换吗?
下面是我写的代码,考虑了主持人知道或者不知道的情况,前者为1:2,后者为1:1,大家看看有问题吗?

   void t()
{
int player;
int emcee;
int otherchoose;// 要交换的那个
int noChooseWin = 0;
int chooseWin = 0;
int gift = 0;
int[] box = new int[3];
Random random = new Random();
for (int c = 0; c < 10000; c++)
{
gift = random.Next(3);

for (int i = 0; i < 3; i++)
{
if (gift == i)
box[i] = 1;//有礼物
else
box[i] = 0;
}

player = random.Next(3);

bool emceeIsKnown = false;
if (emceeIsKnown) // 假设主持人知道盒子的情况
{
do
{ // 主持人选的盒子
emcee = random.Next(3);
} while (emcee == gift || emcee == player);

do
{// 剩下的那个要交换的盒子
otherchoose = random.Next(3);
} while (otherchoose == player || otherchoose == emcee);

if (box[player] == 1)
{
noChooseWin++;
}
else if (box[otherchoose] == 1)
{
chooseWin++;
}
}
else // 假设主持人不知道盒子的情况
{
do


{
emcee = random.Next(3);
} while (emcee == player);
do
{
otherchoose = random.Next(3);
} while (otherchoose == player || otherchoose == emcee);
if (box[emcee] == 0) // 因为主持人打开的盒子为空,所以肯定是在这种情况下计算
{
if (box[player] == 1)
{
noChooseWin++;
}
else if (box[otherchoose] == 1)
{
chooseWin++;
}
}
}
}
Console.WriteLine("noChooseWin : chooseWin = " + noChooseWin + " : " + chooseWin);
}


[解决办法]
不知道你想说什么
但是很明显那样考虑是有问题的
显然,你不换然只有1/3的概率,换了就有2/3的概率
因为主持人作为知情者打开一个空盒子,不会之前放入奖品时的概率分布,即你选中的概率是1/3
,奖品在另外那两个盒子的概率是2/3

读书人网 >软件架构设计

热点推荐