【发布时间】:2016-05-13 04:04:31
【问题描述】:
我正在尝试分发一个系统,我需要使用来自Random Java 类的nextGaussian()。我发现打破唯一种子创建的数据依赖性的唯一方法是使用多个种子,从而创建多个随机数。
让我们忘记我的问题的上下文,我只想知道与仅使用一个实例相比,使用多个 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;
}
当我将这两个数组应用于我的代码时,我得到的结果非常不同。我只是无法解释为什么。
编辑:我知道这不会生成相同的数组,只是当使用大量 规范化 随机数来计算一个数字时,两个数字应该接近(因为规范化),但事实并非如此。
【问题讨论】:
-
RNG 不应该用于生成一个数字,它们在多次使用时会产生更好的结果。你检查过
genNew产生的值吗? -
是的,价值观很糟糕。这就是为什么我想知道我是否做错了什么......
-
为什么这些值“很烂”?为什么你认为它们不是随机的?只要你使用
genSame()的方法,它们应该是相当随机的,虽然计算机永远不能真正做到随机,但可以非常接近。 Have a look here for more info on random numbers -
您应该自己尝试一下。我也是这么想的,对我来说,它们不是“非常”随机的,这对我来说是不合逻辑的。我也很惊讶,我无法理解这种行为。它们“看起来”是随机的……但是当你取不同连续种子随机数的第一个值时,它们并不是很随机。
-
另外,请在下面查看我的答案。那个素数使他们行为正确。我系统地对此进行了测试。我知道,这太疯狂了……我也不喜欢。我希望我错了,我希望有人解释到底发生了什么以及我错的原因。
标签: java random normal-distribution random-seed