每当我们在Java中创建 Random
类的对象时。我们的构造函数
- Random()
- 随机(长种子)
第二个构造函数中seed
的目的是什么?我该如何使用它来受益,即操纵其使用?
上面的答案清楚地总结了它。根据Oracle的Java API文档,第一个构造函数
Random()
"创建一个新的随机数生成器。此构造函数将随机数生成器的种子设置为一个值,很可能与此构造函数的任何其他调用不同。"
种子可能是当前时间或当前时间本身的导数。这应该足以"非常有可能与任何其他调用不同"。从本质上讲,这很可能是您所需要的。
那么,为什么另一个构造构造器摄取种子?
简单地说,如果要一遍又一遍地生成相同的随机数,则在随机构造函数上使用相同的种子。在不同的控制集进行实验时,这很有用,并且您不想打扰创建自己的随机输入表,但仍然需要在其他实验/控制集中使用相同的随机输入。
计算中没有真正的随机数。在所有编程语言中获取随机数的可用方法不过是模拟随机数的算法。
在某些语言中(我肯定知道C ),一个未种子的随机数生成器将在程序的每个新作品中返回相同的一系列数字。
常见的是将随机数生成器与当前时间播种(对于大多数目的而言将足够随机),以便算法每次以随机数开头。
pseudo-random编号生成器维护一些状态信息,通过某些复发关系来提出这些信息,以确定状态的下一个值。PRNG的输出是状态的一定函数。Java的Random
类使用线性一致的生成器。LCG的工作使用复发关系U i 1 =(a u
基于此,您可以看到,如果以相同的状态开始,则将从PRNG中获得完全相同的值序列。如果您想能够重现与"随机性"的序列,例如用于调试或比较两个实验。
,这将很有用。如果您在没有参数的情况下调用构造函数,它将为状态选择一个起始值,并承诺不同的调用很可能彼此不同。如果您向构造函数提供种子,则使用种子的值来设置初始状态。