C#Random类是如何工作的

时间:2016-08-20 13:39:37

标签: c# random

我想了解C#Random.next()是如何工作的,所以我开始搜索一些东西,然后我就会从时钟中获取随机种子:DateTime.Now.Millisecond。所以我想如果你连续创建了很多Random对象,它会吐出相同的数字,我想检查一下并创建这个代码片段。

static void Main(string[] args)
        {
            Random rn;
            while (true)
            {
                rn = new Random();
                Console.WriteLine(DateTime.Now.Millisecond.ToString());
                Console.WriteLine(rn.Next(10));
            }

        }

当我跑了这个时,我当然得到了很多数字,其中相同,但我认为当DateTime.Now.Millisecond将要改变时,它也会改变随机数,但这不是你可以在这个输出中看到这种情况。

9
127
9
127
9
127
9
127
9
127
9
127
9
127
9
128
9
128
9
128
9
128
9
128
9

那么,当DateTime.Now.Millisecond发生变化时,为什么随机数不变?请注意我刚开始学习C#所以如果我犯了很多错误,我很抱歉。

2 个答案:

答案 0 :(得分:2)

根据source code,无参数构造函数定义为:

  public Random() 
    : this(Environment.TickCount) {
  }

这意味着它不会使用DateTime.Now.Millisecond作为种子,而是使用Environment.TickCount值。

所以,如果你编写这样的代码:

Random rn;
while (true)
{
    rn = new Random();
    Console.WriteLine(Environment.TickCount);
    Console.WriteLine(rn.Next(10));
}

它应该产生预期的输出。试试吧!

答案 1 :(得分:0)

从一组有限的数字中以相等的概率选择伪随机数。所选择的数字不是完全随机的,因为使用数学算法来选择它们,但是出于实际目的它们是足够随机的。 Random类的当前实现基于Donald E. Knuth的减法随机数生成器算法的修改版本。

每次执行新的Random()时,都会使用时钟进行初始化。这意味着在紧密循环中,您可以多次获得相同的值。您应该保留一个Random实例并继续在同一个实例上使用Next。

试试这个

static void Main(string[] args)
        {
            Random rn= new Random();
            while (true)
            {

                Console.WriteLine(DateTime.Now.Millisecond.ToString());
                Console.WriteLine(rn.Next(10));
            }

    }