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

时间:2016-02-02 14:40:35

标签: c# .net

我试图理解更好的随机数生成过程,特别是.NET中的伪随机数生成(实际上是MONO),我读完这些文章之后:MSDN Randomwikipedia Random number generation

所以我认为我得到它(.NET使用Donald E. Knuth的减法随机数生成器算法的修改版本。)

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

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

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

4 个答案:

答案 0 :(得分:4)

来自Reference Random Class

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

public Random(int Seed) {
        ///....
}

根据您的输入或Tick计数

计算

答案 1 :(得分:3)

Random类有一个构造函数,它接受no或类型int的一个参数。因此,您可以自己设置初始种子。 如果您没有提供参数而不是文档说明时间依赖值用作种子。默认值是自系统启动以来经过的刻度数(see source)。

答案 2 :(得分:3)

  

默认种子值来自系统时钟

来源Random() constructor

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

答案 3 :(得分:2)

System.Random使用Environment.TickCount作为无参数构造函数中的种子,符合.NET source