使用Random的C#程序在运行和交互式调试时以不同的方式执行

时间:2018-02-22 00:13:58

标签: c#

我正在尝试制作一台电脑。电脑猜谜游戏。我已经在python和matlab上完成了它,但我很难用c#做它。

我不认为应用程序正在执行循环,但是当使用调试器逐步执行应用程序时,它似乎按预期工作。

using System;
using static System.Console;

namespace ComVsCom
{
    class ComVsCom
    {
        static void Main(string[] args)
        {
            int rand, comp, pick = 0;
            bool tri = false;
            Random number = new Random();
            rand = number.Next(1, 10);
            Random computer = new Random();
            comp = computer.Next(1, 10);

            while (comp != rand && tri == false)
            {
                if (comp > rand)
                    WriteLine("Guess again you are too high!");
                if (comp < rand)
                    WriteLine("Guess again you are too low!");
                 pick++;
                 WriteLine("{0} attempt", pick);
                 comp = computer.Next(1, 10);
                if (comp == rand)
                {
                    WriteLine("You got it! it took you {0} times the number was {1}", pick, rand);
                    tri = true;
                }
            }
        }
    }
}

正常运行程序,它终止没有输出。但是,调试给定的输出是预期的,如下所示:

Guess again you are too high!
3 attempt
Guess again you are too low
6 attempt
You got it! it took you 3 times the number was 6

为什么在使用调试器时这是有效的,而不是在正常运行程序时呢?

1 个答案:

答案 0 :(得分:3)

问题几乎肯定是你永远不会进入循环:

请参阅https://msdn.microsoft.com/en-us/library/h343ddh9(v=vs.110).aspx

  

默认种子值源自系统时钟并具有有限的分辨率。因此,通过调用默认构造函数紧密连续创建的不同Random对象将具有相同的默认种子值,因此将生成相同的随机数集。

您在开始时创建两个Random,然后在每个Random上调用完全相同的方法。正如基于文档所预期的那样,它们产生完全相同的结果。在循环条件中,您检查它们是否不同 - 它们不是,所以永远不会输入循环。因为你的所有程序逻辑都在那个循环中,所以它都不会发生。

请注意,调试时的不同行为可能是由于逐步构建Randoms,使它们在不同的时间发生,因此它们将具有不同的种子值并产生不同的序列。