随机均匀分布
问题描述:
我知道如果我使用Java中的随机生成器,使用nextInt生成数字,数字将是均匀分布的。但是如果我使用两个Random实例,会发生什么情况,这两个Random实例都会产生数字。这些号码是否均匀分布?随机均匀分布
答
每个Random
实例生成的数字将是均匀分布的,所以如果将两个Random
实例生成的随机数序列组合在一起,它们也应该是均匀分布的。
请注意,即使生成的分布是一致的,您可能也需要注意种子以避免两个生成器输出之间的相关性。如果使用默认的无参数构造函数,则种子应该已经不同。从java.util.Random
源代码:
private static volatile long seedUniquifier = 8682522807148012L;
public Random() { this(++seedUniquifier + System.nanoTime()); }
如果您明确设置种子(通过使用Random(long seed)
构造,或致电setSeed(long seed)
),你需要利用这个照顾自己。一种可能的方法是使用随机数发生器为所有其他发生器产生种子。
答
那么,如果你种两个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号总:
这里是运行一个单一的RNG到的分布产生2000个号码合计:
似乎哪种方法产生移到该有限集合更高质量的离散均匀分布很清楚。
现在几乎所有人都知道,如果您正在寻找高质量的随机性,播种两个相同种子的RNG是一个坏主意。但是这种情况确实让你停下来想:有创建了一个场景,其中每个RNG独立发出相当高质量的随机性,但是当它们的输出结合时,它的质量明显较低(离散度较低)。
除`挥发性`不被授予原子。 – 2010-11-23 08:59:15
@ J-16:我相信可以保证使用Java 1.5引入的新Java内存模型(http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile )。无论如何,这不是我的代码;它是java.util.Random的内部实现。 – Grodriguez 2010-11-23 09:14:50