我正在尝试分发系统,并且需要使用 Random
Java 类中的 nextGaussian()
。我发现打破唯一种子创建的数据依赖性的唯一方法是使用多个种子,从而创建多个随机数。
让我们忘记我的问题的背景,我只想知道与仅使用一个实例相比,使用多个随机实例的归一化效果如何。换句话说...与 genSame
相比,这个 genNew
的随机性如何?
代码:
public double[] genNew(int lim, long seed)
{
double[] rand = new double[lim];
for(int i = 0; i < lim; i++)
{
//A random for each iteration.
Random r = new Random(i*seed);
rand[i] = r.nextGaussian();
}
return rand;
}
public double[] genSame(int lim, long seed)
{
double[] rand = new double[lim];
//A random for all iterations
Random r = new Random(seed);
for(int i = 0; i < lim; i++)
rand[i] = r.nextGaussian();
return rand;
}
当我将这两个数组应用于我的代码时,我得到的结果非常不同。我只是无法解释为什么。
编辑:我知道这不会生成相同的数组,只是当使用大量标准化随机数来计算数字时,两个数字应该接近(因为标准化),但事实并非如此。
最佳答案
我找到了一种生成准确数字并打破数据依赖性的方法。
我不明白为什么这个因素起作用,但它确实起作用。我偶然发现了它,并且对它进行了近一百万次测试,并且一直工作没有失败。
如果有人理解为什么这样做,请告诉:
Random r = new Random(seed * 43112609)
这个数是素数。这是我唯一的线索,但我仍然不明白它为什么起作用。
关于java - 创建新的随机数与使用相同的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37201040/