首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有延迟初始化的随机数数组

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

Stack Overflow用户
提问于 2014-04-16 09:36:51
回答 2查看 344关注 0票数 2

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

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

另一种方法是(psedocode):

代码语言:javascript
复制
rng.setSeed(42);
int[] rndArray;
for(...) {
    rndArray[i] = rng.nextInt();
}

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-16 10:21:30

你可以使用一个基于随机种子的公式。

例如:

代码语言:javascript
复制
public static int generate(long seed, int index) {
    Random rand = new Random(seed + index * SOME_PRIME);
    return rand.nextInt();
}

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

代码语言:javascript
复制
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);
}
票数 4
EN

Stack Overflow用户

发布于 2014-04-17 14:04:31

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

否则,您可以从Programming Pearls中回收解决问题的解决方案(搜索类似于“编程珍珠初始化数组”之类的内容),但这会浪费内存iirc。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23105486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档