gpt4 book ai didi

c# - Monty Hall 程序模拟 (C#)

转载 作者:太空狗 更新时间:2023-10-29 20:17:22 24 4
gpt4 key购买 nike

我正在尝试模拟 Monty Hall Problem (因为我从书中读到 Think Statistics 一个人只有在看到计算机模拟后才会被说服)C#,我最熟悉的编程语言。我的场景是奖品的位置是随机的(每次运行),我的选择是随机的,游戏主持人选择开门是随机的(如果我选择了非奖品就不能随机)。

但令人惊讶的是,无论我是否切换,我的程序都达到了 50:50 获胜机会的结果。这是它的代码(请原谅我的冗长):

class Program
{
static void Main(string[] args)
{
Random rand = new Random();

int noSwitchWins = RunGames(rand, false, 10000);
int switchWins = RunGames(rand, true, 10000);

Console.WriteLine(string.Format("If you don't switch, you will win {0} out of 1000 games.", noSwitchWins));
Console.WriteLine(string.Format("If you switch, you will win {0} out of 1000 games.", switchWins));

Console.ReadLine();
}

static int RunGames(Random rand, bool doSwitch, int numberOfRuns)
{
int counter = 0;

for (int i = 0; i < numberOfRuns; i++)
{
bool isWin = RunGame(rand, doSwitch);
if (isWin)
counter++;
}

return counter;
}

static bool RunGame(Random rand, bool doSwitch)
{
int prize = rand.Next(0, 2);
int selection = rand.Next(0, 2);

// available choices
List<Choice> choices = new List<Choice> { new Choice(), new Choice(), new Choice() };
choices[prize].IsPrize = true;
choices[selection].IsSelected = true;
Choice selectedChoice = choices[selection];
int randomlyDisplayedDoor = rand.Next(0, 1);

// one of the choices are displayed
var choicesToDisplay = choices.Where(x => !x.IsSelected && !x.IsPrize);
var displayedChoice = choicesToDisplay.ElementAt(choicesToDisplay.Count() == 1 ? 0 : randomlyDisplayedDoor);
choices.Remove(displayedChoice);

// would you like to switch?
if (doSwitch)
{
Choice initialChoice = choices.Where(x => x.IsSelected).FirstOrDefault();
selectedChoice = choices.Where(x => !x.IsSelected).FirstOrDefault();
selectedChoice.IsSelected = true;
}

return selectedChoice.IsPrize;
}
}

class Choice
{
public bool IsPrize = false;
public bool IsSelected = false;
}

这完全是为了我自己的兴趣,我用我最熟悉最舒服的方式写的。请随时提出您自己的意见和批评,非常感谢!

最佳答案

rand.Next(0,2)

只返回0或1;上限是独占的。你永远不会选择第三扇门(除非你切换),第三扇门永远不会有奖品。您正在为错误的问题建模。

改为尝试:

rand.Next(0,3)

同样:

int randomlyDisplayedDoor = rand.Next(0, 1);

只选择第一个候选门;应该是:

int randomlyDisplayedDoor = rand.Next(0, 2);

现在我们得到:

If you don't switch, you will win 3320 out of 1000 games.
If you switch, you will win 6639 out of 1000 games.

注意 - 当等于时,上限包含 - 即 rand.Next(1,1) 总是返回 1.

关于c# - Monty Hall 程序模拟 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16213882/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com