随机均匀分布

时间:2010-11-23 06:56:32

标签: java random

我知道如果我使用Java的Random生成器,使用nextInt生成数字,数字将是均匀分布的。但是如果我使用2个Random实例会发生什么,用两个Random类生成数字。这些数字是否均匀分布?

2 个答案:

答案 0 :(得分:8)

每个Random实例生成的数字将是均匀分布的,因此如果组合两个Random实例生成的随机数序列,它们也应该均匀分布。

请注意,即使结果分布均匀,您也可能需要注意种子以避免两个生成器的输出之间的相关性。如果使用默认的no-arg构造函数,则种子应该已经不同了。来自java.util.Random的源代码:

private static volatile long seedUniquifier = 8682522807148012L;

public Random() { this(++seedUniquifier + System.nanoTime()); }

如果您明确设置种子(使用Random(long seed)构造函数或调用setSeed(long seed)),则需要自己处理。一种可能的方法是使用随机数生成器为所有其他生成器生成种子。

答案 1 :(得分:8)

好吧,如果您使用相同的值对两个Random实例进行种子处理,您肯定无法获得高质量的离散均匀分布。考虑最基本的情况,它实际上打印两次完全相同的数字(没有那么多随机...)

public class RngTest2 {
    public static void main(String[] args) throws Exception {
        long currentTime = System.currentTimeMillis();
        Random r1 = new Random(currentTime);
        Random r2 = new Random(currentTime);
        System.out.println(r1.nextInt());
        System.out.println(r2.nextInt());
    }        
}

但这只是一次迭代。如果我们开始增加样本量会发生什么?

以下是并排运行两个相同种子的RNG以产生2000个数字的分布的散点图:

alt text

以下是运行单个RNG以分别生成2000个数字的分布:

alt text

似乎很清楚哪种方法在这个有限集上产生了更高质量的离散均匀分布。

现在几乎所有人都知道,如果你正在寻找高质量的随机性,那么用相同的种子播种两个RNG是一个坏主意。但是这种情况确实让你停下来思考:我们已经创建了一个场景,其中每个RNG独立地发出相当高质量的随机性,但是当它们的输出组合时,它的质量显着降低(不那么离散)。