c#随机类是如何工作的

本文关键字:工作 何工作 随机 | 更新日期: 2023-09-27 18:03:17

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

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#,所以如果我犯了很多错误,我很抱歉。

c#随机类是如何工作的

根据源代码,无参数构造函数定义为:

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

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

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

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

try this

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