请在java.util中解释一下种子在Random类中的作用

时间:2014-01-21 04:13:29

标签: java random seed

每当我们在java中创建 Random 类的对象时。我们是构造函数之一

  • 随机()
  • 随机(长种子)

第二个构造函数中seed的目的是什么?如何使用它来实现我的利益,即操纵它的使用?

3 个答案:

答案 0 :(得分:2)

在计算中没有真正的随机数字。在所有编程语言中获取随机数的可用方法只不过是模拟随机数的算法。

在某些语言中(C ++,我肯定知道),一个未播种的随机数生成器将在每次执行程序时返回相同的数字序列。

通常的做法是使用当前时间为随机数生成器播种(对于大多数用途来说,它将是随机的),以便算法每次都以随机数开始。

答案 1 :(得分:2)

上面的答案清楚地总结了一下。根据{{​​3}},第一个构造函数

Random()

“创建一个新的随机数生成器。此构造函数将随机数生成器的种子设置为一个非常可能与此构造函数的任何其他调用不同的值。”

种子可能是当前时间或当前时间本身的衍生物。这应该足以“很可能与任何其他调用不同”。从本质上讲,这很可能是你所需要的,大部分时间。

那么为什么还有另一个带种子的构造函数呢?

简单地说,如果要反复生成相同的随机数集,则在Random构造函数上使用相同的种子。当在不同的控制集上进行实验时,这很有用,并且您不想打扰创建自己的随机输入表,但仍希望在不同的实验/控制集上使用相同的随机输入集。

答案 2 :(得分:0)

伪随机数生成器维护一组状态信息,通过一些递归关系推进该状态信息以确定状态的下一个值。 PRNG的输出是状态的一些功能。 Java的Random类使用线性同余生成器。 LCG的工作使用递归关系U i + 1 =(AU i + C)%M得到一些常数整数值A,C和M.Java的当前实现使用了48位状态,但在每次重复迭代时使用32位或更少。

基于此,您可以看到,如果您从相同的状态开始,您将从PRNG中获得完全相同的值序列。如果您希望能够重现完全相同的“随机性”序列,例如调试或比较两个实验,这将非常有用。

如果在没有参数的情况下调用构造函数,它会为状态选择一个起始值,并承诺不同的调用很可能彼此不同。如果向构造函数提供种子,则该种子的值用于设置初始状态。