Solved

Running Debugged vs. Non-Debugged

Posted on 2004-08-28
2
207 Views
Last Modified: 2010-04-15
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
Comment
Question by:schwarz2
2 Comments
 
LVL 3

Accepted Solution

by:
GrumbleBot earned 125 total points
Comment Utility
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
 

Author Comment

by:schwarz2
Comment Utility
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

How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

Join & Write a Comment

Article by: Ivo
Anonymous Types in C# by Ivo Stoykov Anonymous Types are useful when  we do not need to follow usual work-flow -- creating object of some type, assign some read-only values and then doing something with them. Instead we can encapsulate this read…
Introduction This article series is supposed to shed some light on the use of IDisposable and objects that inherit from it. In essence, a more apt title for this article would be: using (IDisposable) {}. I’m just not sure how many people would ge…
Excel styles will make formatting consistent and let you apply and change formatting faster. In this tutorial, you'll learn how to use Excel's built-in styles, how to modify styles, and how to create your own. You'll also learn how to use your custo…
This video shows how to remove a single email address from the Outlook 2010 Auto Suggestion memory. NOTE: For Outlook 2016 and 2013 perform the exact same steps. Open a new email: Click the New email button in Outlook. Start typing the address: …

763 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now