【问题标题】:Creating new random vs using same random创建新随机与使用相同随机
【发布时间】:2016-05-13 04:04:31
【问题描述】:

我正在尝试分发一个系统,我需要使用来自Random Java 类的nextGaussian()。我发现打破唯一种子创建的数据依赖性的唯一方法是使用多个种子,从而创建多个随机数。

让我们忘记我的问题的上下文,我只想知道与仅使用一个实例相比,使用多个 Random 实例进行规范化的效果如何。换句话说……这个genNewgenSame 相比有多随机?

代码:

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


【解决方案1】:

我找到了一种生成适当数字并打破数据依赖性的方法。

我不明白为什么这个因素会起作用,但确实如此。我偶然发现了它,我已经对其进行了近一百万次的测试,并且一直在工作而没有失败。

如果有人明白为什么会这样,请告诉:

Random r = new Random(seed * 43112609)

这个数是质数。这是我唯一的线索,但我仍然无法理解它为什么会起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 2021-12-14
    • 2016-12-16
    • 2013-01-25
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    相关资源
    最近更新 更多