伪随机数生成器如何获得“第一个”种子数

本文关键字:第一个 种子 随机数生成器 何获得 | 更新日期: 2023-09-27 18:32:51

我试图更好地理解随机数生成过程,特别是.NET中的伪随机数生成(实际上是MONO(,我读完这些文章:MSDN Random,维基百科随机数生成。

所以我想我明白了(.NET 使用唐纳德·高德纳的减法随机数生成器算法的修改版本(。

我唯一不清楚的是这个算法是如何获得它的第一个种子号的。我试图查找信息,但没有。

它也需要伪随机数生成器吗?这没有意义,是吗?第一个种子也需要以某种方式随机,如果不是每个 .NET 应用程序实例中的第一个随机数,则相同。如果是这样,从游戏等应用程序中查询下一个结果将非常容易(如果应用程序的作者在生成后没有修改数字(。所以我正在查询第一个种子号,我的意思是生成器的第一个输入必须取自机器或当前应用程序过程的独特内容,但我只是在查询。

所以我的问题是:如果我的思维过程是正确的(如果不是,请纠正我(,生成器如何获得给定算法的第一个输入?

伪随机数生成器如何获得“第一个”种子数

来自Reference Random Class

public Random() 
: this(Environment.TickCount) {
}
public Random(int Seed) {
        ///....
}

它是根据您的输入或即时报价计数计算的

默认种子值派生自系统时钟

源 Random(( 构造函数

因此,单独的实例会获得不同的随机值。但是,如果您快速创建此类的多个实例,它们最终可能会使用相同的时钟周期作为种子 - 从而生成相同的序列。

Random类有一个构造函数,该构造函数不接受 no 或一个类型 int 的参数。因此,您可以自己设置初始种子。如果您不提供参数,则如文档所述,则使用与时间相关的值作为种子。默认值是自系统启动以来经过的逐笔报价数(请参阅源(。

System.Random根据 .NET 源使用 Environment.TickCount 作为其无参数构造函数中的种子。