【问题标题】:Do I need to seed manually when using Random in java?在 java 中使用 Random 时是否需要手动播种?
【发布时间】:2014-11-09 11:03:44
【问题描述】:

在 Java 中:

我知道Random.setSeed(long seed); 做了什么。我知道什么是种子,以及每次使用它会如何变化。我是否需要手动更改种子以确保序列在一段时间后不会重复,或者它使用变量(例如系统时钟)自动操纵种子?

除非我指定种子,否则再次运行相同的程序不会产生相同的结果,因此它必须在构造函数中操作种子,但它会定期更改种子(我不是在谈论每次使用时更改种子)?

澄清:

种子会随着每次使用而变化,但在某些时候种子会变成构造随机数时的数字。

我需要打电话给Random.setSeed(System.currentTimeInMillis())吗?偶尔确保序列在使用后不会重复?

【问题讨论】:

  • 我认为我的沟通有问题。种子随每次使用而变化。经过一些使用后,它变成了构建 Random 时的数字,并从该点开始重复序列。如果我偶尔使用系统时钟序列手动设置种子,它永远不会重复。但是 Random 类自己做吗?链接的问题没有回答我的问题。

标签: java random random-seed


【解决方案1】:

这取决于你想要什么。如果我想要“随机”但可重复,那么我有固定的种子。否则,几乎没有理由修复或更换种子。 种子的充分理由包括:

  • 测试。所以每次出现的特定随机模式都是一样的。
  • 评估。因此不同的测试用例得到相同的值序列,因此可以公平地进行比较。

如果你真的想改变种子,或者有多个具有独立种子的随机生成器,那么创建新的 Random 对象。

【讨论】:

  • 每当产生一个新数字时,种子都会用于某些计算,结果数字成为新的种子。使用一段时间后,种子变得与第一次设置时相同。在那之后,产生的数字与产生的第一个数字相同。那时我可以手动设置种子以避免重复。我的问题是我需要这样做还是随机类会自动更改种子以避免重复。
  • 我认为你应该先得到很多个数字,然后再把种子包起来。我刚刚快速浏览了代码,看不到 Random 为您进行此测试。如果确实如此,我会感到惊讶。如果你调用 next() 那么多,那么你可能也会担心性能。所有这些额外的条件都无济于事。如果您真的对此感到担心,请编写一些单独的代码并尝试生成随机数(带有一些种子)并查看序列重复需要多长时间!
  • 你的评论正是我想要的。
【解决方案2】:

您无需在 Random 对象创建后不断更新其种子,以使其保持“随机”状态。

【讨论】:

    【解决方案3】:

    无参数构造函数已经解决了这个问题:

    /**
     * Creates a new random number generator. This constructor sets
     * the seed of the random number generator to a value very likely
     * to be distinct from any other invocation of this constructor.
     */
    public Random();
    

    如果您想在代码的连续执行中生成相同的伪随机数序列(这对于调试目的很有用),则设置种子(或向构造函数提供种子)很有用。

    【讨论】:

    • 根据您的说法,它在构建时设置了种子,但没有说明动态更改种子。在某些使用后不改变种子必然会重复相同的序列。
    • @WVrock 为现有的 Random 实例设置种子与使用接受种子作为参数的构造函数构造新的 Random 实例的效果相同。
    猜你喜欢
    • 2019-04-15
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    相关资源
    最近更新 更多