Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 218
  • Last Modified:

Running Debugged vs. Non-Debugged

Hi,
I have a program that simulates a game many times and returns the percent of the time that each team won (8 teams).  I believe I have all the logics correct, but I'm finding some odd results.  When I run the program stepping through the lines (in debug mode obviously), it distributes the wins correctly.  However, when I simply run the program through for 100 trials, one team will win all 100 times.  And then if I run it again, another team will win 100 times.  Then again, and team 1 will win 84 times and team 2 will win 16 times and the other 6 teams won't win at all.  Now if I run the program through a million trials, it seems to distribute nicely.  I'm really confused as to why this would ever happen.  My logic is correct since as I said before, running the program debugged works fine.  This is C# dot net console program btw.

Here's my code:
using System;

namespace Project1
{
      class Class1
      {
            [STAThread]
            public static void Main(string[] args)
            {
                  int gameWinner;
                  double percentWon;
                  int[] teamGames = new int[8];
                  
                  for (int xx = 1; xx <= 100; xx++)
                  {
                        gameWinner = Class1.RunGame();
                        teamGames[gameWinner]++;
                  }

                  for (int yy = 1; yy <= 8; yy++)
                  {
                        percentWon = (teamGames[yy - 1]/100.000);
                        Console.WriteLine("Team " + yy + " = " + percentWon);
                  }
            }
            
            public static int RunGame()
            {
                  int team1, team2, teamondeck, pointmod, winner;
                  int[] teamWins = new int[8];

                  team1 = 1;
                  team2 = 2;
                  teamondeck = 3;
                  pointmod = 1;
                  Random r = new Random();
                  
                  while (true)
                  {
                        if (r.NextDouble() >= .5)
                        {
                              teamWins[team1 - 1] = teamWins[team1 - 1] + pointmod;
                              if (teamWins[team1 - 1] >= 7)
                              {
                                    winner = team1 - 1;
                                    break;
                              }
                              team2 = teamondeck;
                              teamondeck++;
                        }
                        else
                        {
                              teamWins[team2 - 1] = teamWins[team2 - 1] + pointmod;
                              if (teamWins[team2 - 1] >= 7)
                              {
                                    winner = team2 - 1;
                                    break;
                              }
                              team1 = team2;
                              team2 = teamondeck;
                              teamondeck++;
                        }
                        if (teamondeck > 8)
                        {
                              teamondeck = 1;
                              pointmod = 2;
                        }
                  }
                  return winner;
            }
      }
}


I'd appreciate any help.  Thanks!!
0
schwarz2
Asked:
schwarz2
1 Solution
 
GrumbleBotCommented:
I found by making the variable r a global variable your program works correctly. Not sure if I can explain why it doesn't work the way that you have it. But if i basically set up a random numbe rin a fuction and fill a listbox continually I get the same number for many consecutive values then it changes and repeats those many times , on and on.

Well here is your code modified and it seems to work now.

using System;

namespace Project1
{
      class Class1
      {
            static Random r;

            [STAThread]
            public static void Main(string[] args)
            {
                  int gameWinner;
                  double percentWon;
                  int[] teamGames = new int[8];
                  r = new Random(); //((int)DateTime.Now.Ticks)
               
                  for (int xx = 1; xx <= 100; xx++)
                  {
                        gameWinner = Class1.RunGame();
                        teamGames[gameWinner]++;
                  }

                  for (int yy = 1; yy <= 8; yy++)
                  {
                        percentWon = (teamGames[yy - 1]/100.000);
                        Console.WriteLine("Team " + yy + " = " + percentWon);
                  }
                  
            }
         
            public static int RunGame()
            {
                  int team1, team2, teamondeck, pointmod, winner;
                  int[] teamWins = new int[8];

                  team1 = 1;
                  team2 = 2;
                  teamondeck = 3;
                  pointmod = 1;
               
                  while (true)
                  {
                        if (r.NextDouble() >= .5)
                        {
                              teamWins[team1 - 1] = teamWins[team1 - 1] + pointmod;
                              if (teamWins[team1 - 1] >= 7)
                              {
                                    winner = team1 - 1;
                                    break;
                              }
                              team2 = teamondeck;
                              teamondeck++;
                        }
                        else
                        {
                              teamWins[team2 - 1] = teamWins[team2 - 1] + pointmod;
                              if (teamWins[team2 - 1] >= 7)
                              {
                                    winner = team2 - 1;
                                    break;
                              }
                              team1 = team2;
                              team2 = teamondeck;
                              teamondeck++;
                        }
                        if (teamondeck > 8)
                        {
                              teamondeck = 1;
                              pointmod = 2;
                        }
                  }
                  return winner;
            }
      }
}

Hope this helps.

Good luck
0
 
schwarz2Author Commented:
Excellent, GrumbleBot!!  This was driving me crazy .. I guess C# doesn't re-seed the random variable when it's re-created.  Very strange, but I'm glad you caught it.  Thanks millions.
0

Featured Post

Vote for the Most Valuable Expert

It’s time to recognize experts that go above and beyond with helpful solutions and engagement on site. Choose from the top experts in the Hall of Fame or on the right rail of your favorite topic page. Look for the blue “Nominate” button on their profile to vote.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now