随机均匀分布

2022-09-03 14:22:17

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


答案 1

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

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

private static volatile long seedUniquifier = 8682522807148012L;

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

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


答案 2

好吧,如果您用相同的值为两个实例设定种子,则肯定不会获得高质量的离散均匀分布。考虑最基本的情况,它字面上打印完全相同的数字两次(不会比这更随机......):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

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

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


推荐