Solved

Running Debugged vs. Non-Debugged

Posted on 2004-08-28
2
214 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
2 Comments
 
LVL 3

Accepted Solution

by:
GrumbleBot earned 125 total points
ID: 11925787
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
ID: 11926547
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

MS Dynamics Made Instantly Simpler

Make Your Microsoft Dynamics Investment Count  & Drastically Decrease Training Time by Providing Intuitive Step-By-Step WalkThru Tutorials.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article describes a simple method to resize a control at runtime.  It includes ready-to-use source code and a complete sample demonstration application.  We'll also talk about C# Extension Methods. Introduction In one of my applications…
This article is for Object-Oriented Programming (OOP) beginners. An Interface contains declarations of events, indexers, methods and/or properties. Any class which implements the Interface should provide the concrete implementation for each Inter…
Michael from AdRem Software outlines event notifications and Automatic Corrective Actions in network monitoring. Automatic Corrective Actions are scripts, which can automatically run upon discovery of a certain undesirable condition in your network.…
In this brief tutorial Pawel from AdRem Software explains how you can quickly find out which services are running on your network, or what are the IP addresses of servers responsible for each service. Software used is freeware NetCrunch Tools (https…

632 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