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

时间:2014-04-16 09:36:52

标签: java c++ random

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

这可以通过对随机数发生器(RNG)使用相同的种子来实现。但这仅适用于两个应用程序以相同顺序使用RNG输出的情况。在我看来,这很难甚至是不可能的。

另一种方法是(psedocode):

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

现在两个应用程序都有相同的随机数组,我的问题就解决了。

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

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

2 个答案:

答案 0 :(得分:4)

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

e.g。

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);
}

答案 1 :(得分:0)

如果它的大稀疏,您可以使用哈希表(缺点:您获得的数字取决于您的访问模式)。

否则你可以通过Programming Pearls回收问题的解决方案(搜索"编程珍珠初始化数组"),但它浪费了内存iirc。

我能想到的最后一个解决方案,你可以使用一个可以有效跳转到指定位置的随机生成器 - http://mathforum.org/kb/message.jspa?messageID=1519417处的速度非常快,但它一次生成16个数字;什么更好?