【问题标题】:Method Displays Incorrect Results方法显示不正确的结果
【发布时间】:2014-09-24 07:37:44
【问题描述】:

当我使用调试器单步执行程序时,它工作正常并且显示正确的结果。但是,当我运行程序时,它会显示一些非常高的 homeTeamRuns 和 awayTeamRuns 数字。我似乎无法弄清楚问题所在。

class BallGame
    {
        //Fields
        private string output = ""; 

        int outs = 0;
        int runs = 0;

        int homeTeamRuns = 0;
        int awayTeamRuns = 0;

        bool homeTeam = false;
        bool awayTeam = false;

        int[] innings = new int[12]; //Innings 

        //Properties
         public string Output
         {
             get
             {
                 return output;
             }
             set
             {
                 output = value;
             }
         }

        //Game Simulator
        public void playBall()
        {

            int[] play = new int[4];  //Bases



            for(int i = 1; i <= 2; i++)
            {
                homeTeam = false;
                awayTeam = false;



                if(i%2 == 0)
                    homeTeam = true;
                else 
                    awayTeam = true;

            //Half Inning
            while (outs < 3)
            {

                bool yourOut = false, single = false, double1 = false, triple = false, homerun = false;

                Random rnd1 = new Random();
                int randomNum = rnd1.Next(1, 101);

                //
                if (randomNum >= 1 && randomNum <= 50) //50% chance
                    yourOut = true;
                else if (randomNum > 50 && randomNum <= 60) //10% chance
                    single = true;
                else if (randomNum > 60 && randomNum <= 92) //42% chance
                    double1 = true;
                else if (randomNum > 92 && randomNum <= 97) //5% chance
                    triple = true;
                else if (randomNum > 97 && randomNum <= 100) //%3 chance
                    homerun = true;


                if (yourOut == true)
                {
                    outs++;
                }
                else if (single == true)
                {
                    Shift(play);
                    runScored(play);

                    play[0] = 1;
                }
                else if (double1 == true)
                {
                    Shift(play);
                    runScored(play);

                    Shift(play);
                    runScored(play);

                    play[1] = 1;
                }
                else if (triple == true)
                {
                    Shift(play);
                    runScored(play);

                    Shift(play);
                    runScored(play);

                    Shift(play);
                    runScored(play);

                    play[2] = 1;
                }
                else if (homerun == true)
                {
                    Shift(play);
                    runScored(play);

                    Shift(play);
                    runScored(play);

                    Shift(play);
                    runScored(play);

                    Shift(play);
                    runScored(play);

                    play[3] = 1;
                }


                play[3] = 0;

                if (outs == 3)
                {
                    play[0] = 0;
                    play[1] = 0;
                    play[2] = 0;
                    play[3] = 0;
                }
            }

            outs = 0;

            }
            output = "Home Team Runs: " + homeTeamRuns + " Away Team Runs: " + awayTeamRuns;

         }

        //Shift Array
        public int[] Shift(int[] array)
        {
            for (int i = array.Length -1; i >= 1; i--)
            {
                array[i] = array[i - 1];
            }
            array[0] = 0;

            return array;
        }

        public void runScored(int[] array)
        {
            if(array[3] == 1)
            {
                if(awayTeam == true)
                    awayTeamRuns++;
                else if(homeTeam == true)
                    homeTeamRuns++;
            }
        }


    }

【问题讨论】:

  • 如果您了解自动实现的属性,您的代码会缩短 很多。此外,如果您不解释您期望看到什么与您实际看到什么,就很难知道哪里出了问题。代码实际上不会运行并没有帮助——它显然是更大程序的一部分。一个简短但完整的控制台应用程序会更容易帮助您...(此外,您应该了解List&lt;T&gt;,这样您就不需要搞乱这样的数组...)
  • 你能告诉我们程序给出的值(正确和不正确的结果)吗?
  • 另请注意,您不必将 int 初始化为 0 或将 bools 初始化为 false。你也可以只说if (yourOut) 而不是if (yourOut == true)
  • 学习如何调试代码的好时机。你不能总是在这里转储你的代码并问“我的错误在哪里”
  • 如果我不得不猜测我会说尝试将Random rnd1 = new Random(); 移出循环。我怀疑它使用了相同的种子,因此在调试器外部运行时,对rnd1.Next 的调用返回相同的值。

标签: c#


【解决方案1】:

您正在循环的每次迭代中创建Random 类的新实例。您正在使用的构造函数的 documentation 表示:

使用与时间相关的默认种子值初始化 Random 类的新实例。

当您不调试时循环执行得非常快,您最终会在多次迭代中使用相同的种子,因此对Next 的调用每次都返回相同的值。如果该值恰好是一个会增加分数的值,那么分数将在循环的多次迭代中增加。

移动线

Random rnd1 = new Random();

在您的for 循环之上将构造一个Random 实例,然后为每次调用Next 创建一个新的随机数。

在调试器中运行时无法重现此情况,因为在您创建新的 Random 实例时时钟已经移动,因此种子已更改。

有关返回相同值的 Random 实例的更多信息可以在 this StackOverflow 帖子中找到。此外,Jon Skeet 有一个 blog post 覆盖使用 Random 类时的陷阱,非常值得一读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    相关资源
    最近更新 更多