代码之家  ›  专栏  ›  技术社区  ›  DaJackal

随机均匀分布

  •  15
  • DaJackal  · 技术社区  · 14 年前

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

    2 回复  |  直到 14 年前
        1
  •  9
  •   Grodriguez    14 年前

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

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

    private static volatile long seedUniquifier = 8682522807148012L;
    
    public Random() { this(++seedUniquifier + System.nanoTime()); }
    

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

        2
  •  9
  •   Mike Clark    14 年前

    好吧,如果你两个都是种子 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独立地发射相当高质量的随机性,但当它们的输出被组合时,质量明显降低(离散性降低)