对于分布式应用程序项目,我希望两个实例共享相同/知道(伪)随机数。
这可以通过对随机数生成器 (RNG) 使用相同的种子来实现。但这仅在两个应用程序以相同顺序使用 RNG 输出时才有效。就我而言,这很难甚至是不可能的。
执行此操作的另一种方法是(伪代码):
rng.setSeed(42);
int[] rndArray;
for(...) {
rndArray[i] = rng.nextInt();
}
现在两个应用程序将具有相同的随机数数组,我的问题将得到解决。
但是数组必须很大,非常大。这就是延迟初始化部分的用武之地:如何编写一个类,其中 rndArray.get(i)
始终是相同的随机数(取决于种子)而不生成所有值在 0
和 i-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/