当C#中的对象变量声明为静态时会发生什么

当C#中的对象变量声明为静态时会发生什么,c#,object,random,static,C#,Object,Random,Static,我在for循环中创建了一个名为x的Random类对象,并调用了x.next(1,7),它应该返回一个介于1和6之间的变量,对象创建和x.next()函数被放置在for循环中,该循环执行5次而不是返回随机变量,它在每次迭代中返回相同的值 using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) {

我在
for
循环中创建了一个名为
x
Random
类对象,并调用了
x.next(1,7)
,它应该返回一个介于
1
6
之间的变量,对象创建和
x.next()
函数被放置在for循环中,该循环执行
5次而不是返回随机变量,它在每次迭代中返回相同的值

using System;

namespace ConsoleApplication1
{
    class Program
    {

        static void Main(string[] args)
        {
            for(int i=1;i<=5;i++)
            {
                Random x = new Random();

                Console.WriteLine( x.Next(1,7));
            }

        }
    }
}
 using System;


        namespace ConsoleApplication1
        {
            class Program
            {

                static void Main(string[] args)
                {
                    Random x = new Random();
                    for(int i=1;i<=5;i++)
                    {


                        Console.WriteLine( x.Next(1,7));

                    }

                }
            }
        }
当我将对象声明放在循环之外时,它会在每次迭代中返回随机变量

using System;

namespace ConsoleApplication1
{
    class Program
    {

        static void Main(string[] args)
        {
            for(int i=1;i<=5;i++)
            {
                Random x = new Random();

                Console.WriteLine( x.Next(1,7));
            }

        }
    }
}
 using System;


        namespace ConsoleApplication1
        {
            class Program
            {

                static void Main(string[] args)
                {
                    Random x = new Random();
                    for(int i=1;i<=5;i++)
                    {


                        Console.WriteLine( x.Next(1,7));

                    }

                }
            }
        }
x
被声明为类程序的静态变量时,它也起作用,如下所示

using System;


    namespace ConsoleApplication1
    {
        class Program
        {
            static Random x = new Random();
            static void Main(string[] args)
            {

                for(int i=1;i<=5;i++)
                {


                    Console.WriteLine( x.Next(1,7));

                }

            }
        }
    }
但我想知道为什么在循环中声明对象时它返回相同的值
当对象变量声明为静态时会发生什么呢?

这是因为
Random
的默认构造函数使用种子的当前系统时钟时间

由于系统时钟时间每秒只更新几次,因此如果在紧循环中构造大量的
随机对象,它们的创建速度将非常快,以至于系统时钟时间在这两个对象之间没有变化,从而导致它们使用相同的种子


如果两个
Random
对象使用相同的种子构造,它们将生成相同的随机数序列。这就是您所看到的。

之所以发生这种情况,是因为
Random
的默认构造函数使用当前系统时钟时间作为种子

由于系统时钟时间每秒只更新几次,因此如果在紧循环中构造大量的
随机对象,它们的创建速度将非常快,以至于系统时钟时间在这两个对象之间没有变化,从而导致它们使用相同的种子


如果两个
Random
对象使用相同的种子构造,它们将生成相同的随机数序列。这就是您所看到的。

我想知道当对象变量(这里x)被声明为类(这里是程序)的静态变量时会发生什么。我想知道当对象变量(这里x)被声明为类(这里是程序)的静态变量时会发生什么。答案很好,我不知道。尝试了示例代码,但循环次数为100000,您确实开始看到一些不同的数字最终出现,但它们仍然是相同数字的长序列,仍然与上面的解释相匹配。@Gurukulum:由于您在代码中使用的随机类在系统时钟时间上工作,因此输出有所不同。回答很好,一些我不知道的事情。尝试了示例代码,但循环次数为100000,您确实开始看到一些不同的数字最终出现,但它们仍然是相同数字的长序列,仍然与上面的解释相匹配。@Gurukulum:由于您在代码中使用的随机类在系统时钟时间上工作,因此输出有所不同。
4
7
3
7
9