【问题标题】:best number as a seed for random class最佳数字作为随机类的种子
【发布时间】:2013-06-19 21:31:09
【问题描述】:

我想在两个整数之间生成随机数。在我的情况下,数字必须满足其他一些条件。如果新号码不符合我的条件,我将generator.nextInt(x) 放入循环并再次设置种子。

当我使用System.currentTimeMillis() 作为种子时,生成的数字与循环迭代次数相同。我将System.currentTimeMillis() 替换为System.nanoTime()。结果比上一个好很多。

我想知道有没有更好的方法来设置种子?

【问题讨论】:

  • 您通常根本不需要为您的生成器播种,除非您特别想要可重复的输出序列。你为什么要播种?
  • 您应该使用随机数 o.0 Mind = Blown 为您的随机数播种

标签: java random


【解决方案1】:

您可以使用不带参数的Random 的构造函数。该构造函数已经根据System.nanoTime() 初始化了它的种子。每次调用该构造函数时,种子都会不同。

通常,当您需要可重复的随机数据序列(它们是确定性的)时,您只会自己播种 Random

无论哪种方式,您始终可以继续调用 nextInt(或任何 nextXyz 方法)并不断获得更多随机数,而无需为每个数字重新播种。

Java 中的随机数是伪随机数。他们需要一个用于生成下一个随机数的种子。

【讨论】:

  • @Mahdi 种子是启动序列。对于 Random 和一些 SecureRandom 策略,您可以从给定的种子中获得相同的序列。如果您想稍后重现相同的随机数,这很有用。
  • 来自 Random 的来源 public Random() { this(++seedUniquifier + System.nanoTime()); }
  • @Mahdi 这方面的一个例子是在具有柏​​林噪声的地形生成中,在大、中和小长度尺度上采用随机数,因此地形看起来像连绵起伏的丘陵,但却是随机的。许多网格点将需要大中型随机数,我们可以存储它们,但这会产生问题(在创建顺序和存储方面);所以能够重现地检索 sudo 随机数是有用的
  • 这些随机数的种子(以一种我过于简单化的方式)基于网格位置和主种子
  • @PeterLawrey 长时间使用后序列不会重复吗?如果是这种情况,再次设置种子可以防止它发生。
【解决方案2】:

如果您反复使用 System.currentTimeMillis() 它实际上不会经常更改。即最多每毫秒一次。如果你使用 System.nanoTime() 它可以改变每微秒或更好。

我怀疑您不需要重置种子,因为序列应该是随机的。而是继续选择随机数。

【讨论】:

  • 正如 wrock 所说,这确实会在 2^48 个值之后重复。
【解决方案3】:

您无需再次播种。每次执行generator.nexInt(x) 时都会得到一个新的随机数,即

0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 2016-01-14
    相关资源
    最近更新 更多