java - 具有延迟初始化的随机数数组

标签 java c++ random

对于分布式应用程序项目,我希望两个实例共享相同/知道(伪)随机数。

这可以通过对随机数生成器 (RNG) 使用相同的种子来实现。但这仅在两个应用程序以相同顺序使用 RNG 输出时才有效。就我而言,这很难甚至是不可能的。

执行此操作的另一种方法是(伪代码):

rng.setSeed(42);
int[] rndArray;
for(...) {
    rndArray[i] = rng.nextInt();
}

现在两个应用程序将具有相同的随机数数组,我的问题将得到解决。

但是数组必须很大,非常大。这就是延迟初始化部分的用武之地:如何编写一个类,其中 rndArray.get(i) 始终是相同的随机数(取决于种子)而不生成所有值在 0i-1 之间?

我使用的是JAVA或C++,但是这个问题在大多数编程语言中应该是可以解决的。

最佳答案

您可以使用基于随机种子的公式。

例如

public static int generate(long seed, int index) {
    Random rand = new Random(seed + index * SOME_PRIME);
    return rand.nextInt();
}

这将为给定的种子和索引组合生成相同的值。但不要指望它会很快。另一种方法是使用类似的公式。

public static int generate(long seed, int index) {
    double num = seed * 1123529253211.0 + index * 10123457689.0;
    long num2 = Double.doubleToRawLongBits(num);
    return (int) ((num2 >> 42) ^ (num2 >> 21) ^ num2);
}

关于java - 具有延迟初始化的随机数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23105486/

相关文章:

c++ - 如何用不那么繁琐的方式统计一个随机数产生的次数?

java - 我可以使用 .xml < context-param > 作为 .as 类中的常量吗?

java - 无法恢复 Android 应用程序中的 Activity 错误

java - BigDecimal 四舍五入不四舍五入

javascript - 生成随机 uuid Javascript

Python 随机不工作

java - 创建 volatile 类是否保证 volatile 类变量

c++ - 有人能解释一下这段代码是如何执行的吗?

c++ - 如果成员函数需要多个参数,则使用 mem_fun_ref

c++ - boost::threads - 如何正常关机?