2013-04-25 14 views
7

私はの本を読んでいるので、コンピュータシミュレーションを見た後でしか人が確信していなかったので、私に最も親しみやすいプログラミング言語であるC#でシミュレーションしようとしています。私のシナリオは、賞金のポジションがランダム(各ランごとに)で、私の選択はランダムで、ゲームホストのドアを開く選択は無作為です(私は非賞を選ぶとランダムではありません)。Monty Hall Program Simulation(C#)

私のプログラムでは、私が切り替えるかどうかに関わらず、勝利の確率は50:50になります。ここでは、それまでのコードは(lengthinessのための私を許し)です:

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; 
} 

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

答えて

5
rand.Next(0,2) 

は0または1のみを返します。上限は排他的です。あなたは3番目のドアを決して拾うことはありません(スイッチを入れない限り).3番目のドアには決して賞がありません。あなたは間違った問題をモデリングしています。

代わりに試してみてください。同様に

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を返します。包括下可能System.Int32 乱数の下限を返さ:

+0

が見えます! – matt

1

Random.Next(minValue, maxValue)

パラメータ

のminValue タイプを参照してください。

maxValue 種類:System.Int32 返される乱数の排他的な上限。 maxValueはminValue以上でなければなりません。

1

マルクの答えに追加するには、それは単純になりますので、あなたの下限は、0であるから、あなたもRandom.Next(Int32)を使用することができます。私は、ランダム化部分、おかげで台無しよう

rand.Next(3) 
関連する問題