看到一个老题,进来求解
你参加一个抽奖活动,桌上放着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);
}