【问题标题】:Please explain me the role of seed in class Random in java.util请解释一下种子在 java.util 中 Random 类中的作用
【发布时间】:2026-01-03 21:40:02
【问题描述】:

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

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

seed 在第二个构造函数中的目的是什么?我怎样才能利用它来为我谋取利益,即操纵它的使用?

【问题讨论】:

  • 高级注释中,这些“随机”事物实际上是伪随机。也就是说,它们看起来足够随机以供正常使用,但实际上是可重现的(因此不是真正随机的)——这就是种子输入的来源。对于真正随机的东西,你应该看看环境噪声和类似的东西,但当然那对于简单的应用程序来说,这将是一种过度杀伤力。

标签: java random seed


【解决方案1】:

上面的答案总结得很清楚。按照java api docs from oracle,第一个构造函数

Random()

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

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

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

简单地说,如果您想一遍又一遍地生成相同的随机数集,您可以在 Random 构造函数中使用相同的种子。这在对不同的控制集进行实验时很有用,并且您不想费心创建自己的随机输入表,但仍希望在不同的实验/控制集上使用相同的随机输入集。

【讨论】:

  • 感谢您的回答,在问这个问题之前,我从您那里了解了更多我的意图。
【解决方案2】:

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

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

常见的做法是使用当前时间(对于大多数用途而言足够随机)为随机数生成器播种,以便算法每次都以随机数开始。

【讨论】:

    【解决方案3】:

    伪随机数生成器维护一些状态信息,这些信息通过一些递推关系来确定状态的下一个值。 PRNG 的输出是状态的某种函数。 Java 的Random 类使用线性同余生成器。 LCG 的工作使用递归关系 Ui+1 = (A Ui + C) % M 用于一些常量整数值 A、C 和 M。Java 当前的实现使用48 位状态,但在循环的每次迭代中使用 32 位或更少。

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

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

    【讨论】:

      最近更新 更多