C# 代码只有在使用调试器时才能正常工作?

6

这是我一直在使用的代码。它只是一个简单的程序,用于测试是否有3个随机生成的数字按升序或降序排列。出现问题的原因是如果我使用调试器并逐行执行,则代码正常工作。如果不是,则会显示数字按顺序100%或按顺序100%,这不应该是这样的。

以下是我一直在使用的代码:

        int num1;
        int num2;
        int num3;

        int yes = 0;
        int no = 0;

        for (int i = 0; i <= 99; i++)
        {

            Random rnd = new Random();

            num1 = rnd.Next(1, 11);
            num2 = rnd.Next(1, 11);
            num3 = rnd.Next(1, 11);

            if ( ((num1 <= num2) && (num2 <= num3)) || ((num1 >= num2) && (num2 >= num3)) )
            {
                yes += 1;
            }

            else
            {
                no += 1;
            }

        }


        Console.WriteLine("The Number are in ascending order " + yes.ToString() + " Times");
        Console.WriteLine("The Number are not in ascending order " + no.ToString() + " Times");

        Console.ReadLine();

我认为这可能是伪随机数和生成相同的三个数字的代码有问题,但我还在学习编程,如果有其他帮助将不胜感激。

2个回答

11
< p> new Random() 构造函数使用当前时间作为种子。 < p>除非在调试器中等待,否则您的所有Random实例都具有相同的种子。 < p>您应该使用单个实例。

7
这与随机数的生成方式有关。
如果您采取
Random rnd = new Random();

将其移出循环并按要求操作,您应该能看到所需的结果。

更多背景信息:

随机数生成器使用基于实例化时间的种子。因为您的代码运行非常快,所以种子是相同的,因此数字也是相同的。这就是为什么在单步调试时可以正常工作。

在循环外部实例化 Random 将实例化它一次并使用随机算法生成新数字。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接