util.Random 中的种子是啥?

Posted

技术标签:

【中文标题】util.Random 中的种子是啥?【英文标题】:What is seed in util.Random?util.Random 中的种子是什么? 【发布时间】:2014-04-27 03:56:28 【问题描述】:

我不明白 Seed 在 java.util.Random 中的含义是什么?我已经阅读了Why does this code print “hello world”? 的问题,但我仍然对 seed 感到困惑。谁能友好地描述一下 seed 的真正含义是什么?谢谢。

在setSeed() 方法的文档中...seed - the initial seed 是什么意思?

public void setSeed(长种子) 使用单个长种子设置此随机数生成器的种子。 setSeed 的一般约定是,它会更改此随机数生成器对象的状态,使其处于与刚刚使用参数种子作为种子创建时完全相同的状态。方法 setSeed 由 Random 类实现,方法是将种子原子更新为(seed ^ 0x5DEECE66DL) & ((1L 并清除 nextGaussian() 使用的 haveNextNextGaussian 标志。 由 Random 类实现的 setSeed 恰好只使用给定种子的 48 位。然而,一般来说,覆盖方法可以使用长参数的所有 64 位作为种子值。 参数: seed - 初始种子

如果我能准确理解 seed 的含义,我相信我会清楚地理解 this 的答案。

【问题讨论】:

【参考方案1】:

伪随机数生成器是根据整数实现的,每次您请求一个数字时,伪随机数序列生成器函数会将其转换为另一个整数。

该内部整数的初始值称为种子。我们的想法是每次实例化 Random 时都对其进行不同的设置,因为一旦分配了种子,伪随机序列就是完全确定的。

如果您使用空构造函数new Random(),那么System.currentTimeMillis() 将用于种子,这对于几乎所有情况都足够了。

【讨论】:

【参考方案2】:

伪随机数生成器产生一个数字序列。它 不是真正随机的,但通常是一种数学计算 产生与某些理想分布相匹配的输出,并且 没有明显的图案。为了产生这样的序列,有 必须为生成器存储状态才能生成下一个 该序列中的编号。每次使用一些更新状态 上一步的部分输出。

播种显式初始化此状态。 “种子”是一个开始 点,从那里开始生长。在这种情况下,一系列 数字。

这可用于始终生成相同的序列(通过使用 一个已知的常数种子),这对于具有确定性很有用 行为。这有利于调试,对于一些网络应用程序, 密码学等

或者,在您希望行为不可预测的情况下 (每次运行程序时总是不同的,也许是纸牌游戏), 您可以使用可能会不断变化的数字作为种子,例如 时间。

序列的“随机性”不取决于选择的种子, 尽管它确实取决于不重新播种序列。

取自What is a seed in relation to a random number generation algorithm and why is computer time used to create this seed more often than not?

这应该可以回答您的问题。

【讨论】:

我同意你的回答,但是这个:这可以用于始终生成相同的序列(通过使用已知的常量种子),这对于具有确定性行为很有用准确地说,计算机总是确定性的,因此它们总是具有确定性的行为。正如您实际上已经自己写的那样,它是伪随机的。只是想澄清一下。 伪随机,从某种意义上说,如果您每次提供不同的种子,则会生成一个不同的随机数,该随机数似乎是随机选择的,但它是通过数学计算生成的。随机性取决于每次选择的种子都不同这一事实,因此如果提供相同的种子,则结果数是可预测的,因此是确定性的。 可预测性!=确定性。如果种子设置为系统时间,它仍然是确定性的。我们只是不知道它会是什么。 => 不可预测,但仍具有确定性。【参考方案3】:

java.util.Random.setSeed(long seed):使用单个长种子设置此随机数生成器的种子

语法: public void setSeed(长种子)

参数: seed - 初始种子

使用相同种子构造的每个 Random 都会生成相同的 每次的数字模式

所以基本上我们在想要获取 每次都相同的随机数序列(如视频中 游戏、调试等)

我强烈建议通过这个答案:https://***.com/a/23127798/9080948

还有这个视频:https://youtu.be/86_cnhqSyh0

【讨论】:

以上是关于util.Random 中的种子是啥?的主要内容,如果未能解决你的问题,请参考以下文章

random.nextInt()与Math.random()基础用法

为啥使用带有硬编码种子的 Random 总是产生相同的结果? [复制]

JavaSE8基础 Random 使用默认种子,种子是当前时间的毫秒值

Random

随机数 java.util.Random与java.lang.Math.Random()-Java

JavaSE8基础 Random 使用给定的种子产生随机数