对于分布式应用程序项目,我希望有两个实例共享相同/已知(伪)随机数。
这可以通过对随机数发生器(RNG)使用相同的种子来实现。但这仅适用于两个应用程序以相同顺序使用RNG输出的情况。在我看来,这很难甚至是不可能的。
另一种方法是(psedocode):
rng.setSeed(42);
int[] rndArray;
for(...) {
rndArray[i] = rng.nextInt();
}
现在两个应用程序都有相同的随机数组,我的问题就解决了。
但是数组必须很大,非常大。这是惰性初始化部分的用武之地:如何编写一个类,其中rndArray.get(i)
始终是相同的随机数(取决于种子)而不生成0
和{之间的所有值{1}}吗
我使用的是JAVA或C ++,但这个问题在大多数编程语言中都是可以解决的。
答案 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个数字;什么更好?