7

私はモンティ ホール問題をシミュレートしようとしています ( 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;
}

これは完全に私自身の利益のためであり、私にとって最も親しみやすく快適な方法で書きました。あなた自身の意見や批評を自由に提供してください、どうもありがとうございました!

4

3 に答える 3

1

マークの答えに追加するには、下限が 0 であるためRandom.Next(Int32)を使用することもできます。したがって、単純に次のようになります。

rand.Next(3)
于 2014-06-04T12:58:05.317 に答える