java 随机数 分布_java – 随机数的分布
My real question is whether option 1 is mathematically valid.
讓我們從選項2開始.java.util.Random使用的隨機數生成器在javadoc中指定如下:
The class uses a 48-bit seed, which is modified using a linear congruential formula. (See Donald Knuth, The Art of Computer Programming, Volume 2, Section 3.2.1.)
并且在各種方法的javadoc中有更具體的細節.
但重點是我們使用的是由線性同余公式生成的序列,這樣的公式具有很大程度的自相關性……這可能會有問題.
現在使用選項1,您每次使用具有新種子的不同Random實例,并應用一輪LC公式.因此,您將獲得一系列可能與種子自相關的數字.但是,種子以不同的方式生成,具體取決于Java版本.
Java 6執行此操作:
public Random() { this(++seedUniquifier + System.nanoTime()); }
private static volatile long seedUniquifier = 8682522807148012L;
……根本不是隨機的.如果以恒定間隔創建Random實例,則種子可能間隔很近,因此您的選項#1生成的隨機數序列可能會自動關聯.
相比之下,Java 7和8這樣做:
public Random() {
this(seedUniquifier() ^ System.nanoTime());
}
private static long seedUniquifier() {
// L'Ecuyer, "Tables of Linear Congruential Generators of
// Different Sizes and Good Lattice Structure", 1999
for (;;) {
long current = seedUniquifier.get();
long next = current * 181783497276652981L;
if (seedUniquifier.compareAndSet(current, next))
return next;
}
}
private static final AtomicLong seedUniquifier
= new AtomicLong(8682522807148012L);
由上述產生的種子序列可能是(真實的)隨機性的更好的近似.這可能使您的選項#1優于選項#2.
Java 6到8中選項#1的缺點是System.nanoTime()可能調用涉及系統調用.那是相對昂貴的.
所以簡短的回答是它是特定于Java版本的選項#1和選項#2從數學角度產生質量更好的“隨機”數字.
在這兩種情況下,數字的分布在足夠大的樣本大小上是均勻的,盡管我不確定當過程是確定性時談論概率分布是有意義的.
然而,這兩種方法都不適合作為“加密強度”隨機數發生器.
總結
以上是生活随笔為你收集整理的java 随机数 分布_java – 随机数的分布的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 分表全局id_MySQL分庫
- 下一篇: java的http请求头信息_HTTP请