【问题标题】:What happens when Object Variable in C# declared as static [duplicate]当 C# 中的对象变量声明为静态时会发生什么
【发布时间】:2014-01-31 09:49:18
【问题描述】:

我在for 循环中创建了一个名为xRandom 类对象并调用x.next(1,7),它应该返回一个介于16 之间的变量,对象创建和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));
            }

        }
    }
}

我的输出如下

5
5
5
5
5

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

 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));

                    }

                }
            }
        }

这次我的输出是

4
5
9
3
1

x 被声明为类 Program 的静态变量时也可以使用,如下所示

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));

                }

            }
        }
    }

现在输出是

4
7
3
7
9

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

【问题讨论】:

  • 我想知道当对象变量(这里是x)被声明为类的静态变量(这里是程序)时会发生什么

标签: c# object random static


【解决方案1】:

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

因为系统时钟时间每秒只更新几次,如果你在一个紧密的循环中构造了很多Random对象,它们会被创建得如此之快以至于系统时钟时间在两者之间没有变化,导致他们使用相同的种子。

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

【讨论】:

  • 很好的答案,我不知道。尝试了示例代码,但循环为 100,000,您确实开始看到一些不同的数字最终出现,但它们仍然是相同数字的长序列,仍然符合上述解释。
  • @Gurukulum:由于您在代码中使用的 Random 类适用于系统时钟时间,因此输出会有所不同。
猜你喜欢
  • 1970-01-01
  • 2015-03-31
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 2013-08-01
  • 1970-01-01
相关资源
最近更新 更多