Solved

Running Debugged vs. Non-Debugged

Posted on 2004-08-28
2
209 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
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

Microsoft Certification Exam 74-409

Veeam® is happy to provide the Microsoft community with a study guide prepared by MVP and MCT, Orin Thomas. This guide will take you through each of the exam objectives, helping you to prepare for and pass the examination.

Question has a verified solution.

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

Article by: Najam
Having new technologies does not mean they will completely replace old components.  Recently I had to create WCF that will be called by VB6 component.  Here I will describe what steps one should follow while doing so, please feel free to post any qu…
Introduction Although it is an old technology, serial ports are still being used by many hardware manufacturers. If you develop applications in C#, Microsoft .NET framework has SerialPort class to communicate with the serial ports.  I needed to…
Nobody understands Phishing better than an anti-spam company. That’s why we are providing Phishing Awareness Training to our customers. According to a report by Verizon, only 3% of targeted users report malicious emails to management. With compan…
A short tutorial showing how to set up an email signature in Outlook on the Web (previously known as OWA). For free email signatures designs, visit https://www.mail-signatures.com/articles/signature-templates/?sts=6651 If you want to manage em…

832 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