我正在尝试分发系统,我需要使用nextGaussian()
Java类中的Random
。我发现打破唯一种子创建的数据依赖关系的唯一方法是使用多个种子,从而创建多个randoms。
让我们忘记我的问题的上下文,我只是想知道与仅使用一个实例相比,使用多个Random实例的规范化程度如何。换句话说...... genNew
与genSame
相比有多随机?
代码:
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;
}
当我将两个数组应用于我的代码时,我得到的结果非常不同。我无法解释原因。
编辑:我知道这不会生成相同的数组,只是当使用大量的规范化 randoms来计算数字时,两个数字都应该接近(因为规范化) ),但他们不是。
答案 0 :(得分:0)
我找到了一种生成数字并打破数据依赖的方法。
我不明白为什么这个因素有效,但确实如此。我偶然发现了它,我已经完成了将近一百万次的测试,并继续工作而不会失败。
如果有人了解其原因,请说明:
Random r = new Random(seed * 43112609)
这个数字是一个素数。这是我唯一的线索,但我仍然无法理解为什么会有效。