【问题标题】:Different random number sequences on different computers不同计算机上的不同随机数序列
【发布时间】:2013-12-02 09:10:46
【问题描述】:

如果为随机数生成定义了一个种子数,是否有可能在不同的计算机上实现不同的随机数序列?如果是这样,如何实现相同的序列?

    private static final long seed = 1;

    Random generator = new Random(seed);

    for (int i = 0; i < nchrom; i++) {
        val = (int) Math.round(generater.nextDouble()*(nchrom-1));
        //...
    }

【问题讨论】:

  • 是的,但关键是我使用相同的 SEED 编号。
  • 这就是 Pseudo-RNG 的原理。这些数字并不是真正随机的。它们是使用确定性算法生成的,但根据种子的不同,生成数字的顺序会有所不同。因为我总是使用相同的种子,所以我希望总是得到相同的序列。
  • 如果使用相同的种子,通常应该得到相同的序列。您是否在两个系统上使用相同的 JRE 版本?

标签: java random seed


【解决方案1】:

是的,使用相同的种子,您应该得到相同的数字序列。该算法在文档中指定:

该类的一个实例用于生成伪随机数流。该类使用 48 位种子,该种子使用线性同余公式进行修改。 (参见 Donald Knuth,计算机编程的艺术,第 2 卷,第 3.2.1 节。)

如果Random 的两个实例使用相同的种子创建,并且为每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列。为了保证此属性,为类Random 指定了特定算法。为了 Java 代码的绝对可移植性,Java 实现必须使用此处为类 Random 显示的所有算法。但是,允许类 Random 的子类使用其他算法,只要它们遵守所有方法的通用约定。

我唯一担心的是,如果您使用nextDouble(),您可能会遇到一些浮点单元差异的伪影。我怀疑你不会,但这将是我的担忧。我建议你还是使用nextInt

val = generator.nextInt(nchrom); // Exclusive upper bound

【讨论】:

  • 谢谢,完美。关于你的问题,是的,我确信 nchrom - 1,否则 val 可能 > 比我的数组的大小。
  • @KlausosKlausos:啊 - 使用Math.round 你可能是对的......但是对于nextInt,你需要nchrom,因为它是一个专有的上限。我不确定使用 Math.round 是否会给你一个统一的分布。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 2019-09-25
  • 2019-03-07
  • 2020-04-24
  • 1970-01-01
相关资源
最近更新 更多