看到一个老题,进来求解

灰鸟会灰 2013-05-16 04:56:02
你参加一个抽奖活动,桌上放着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);
}
...全文
259 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
hello_world_ww 2013-05-17
  • 打赏
  • 举报
回复
不知道你想说什么 但是很明显那样考虑是有问题的 显然,你不换然只有1/3的概率,换了就有2/3的概率 因为主持人作为知情者打开一个空盒子,不会之前放入奖品时的概率分布,即你选中的概率是1/3 ,奖品在另外那两个盒子的概率是2/3
灰鸟会灰 2013-05-16
  • 打赏
  • 举报
回复
对了, 是在这个看到的 http://bbs.csdn.net/topics/350030757

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧