2010-11-23 241 views
13

我知道如果我使用Java中的隨機生成器,使用nextInt生成數字,數字將是均勻分佈的。但是如果我使用兩個Random實例,會發生什麼情況,這兩個Random實例都會產生數字。這些號碼是否均勻分佈?隨機均勻分佈

回答

7

每個Random實例生成的數字將是均勻分佈的,所以如果將兩個Random實例生成的隨機數序列組合在一起,它們也應該是均勻分佈的。

請注意,即使生成的分佈是一致的,您可能也需要注意種子以避免兩個生成器輸出之間的相關性。如果使用默認的無參數構造函數,則種子應該已經不同。從java.util.Random源代碼:

private static volatile long seedUniquifier = 8682522807148012L; 

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

如果您明確設置種子(通過使用Random(long seed)構造,或致電setSeed(long seed)),你需要利用這個照顧自己。一種可能的方法是使用隨機數發生器爲所有其他發生器產生種子。

+0

除`揮發性`不被授予原子。 – 2010-11-23 08:59:15

+0

@ 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

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獨立發出相當高質量的隨機性,但是當它們的輸出結合時,它的質量明顯較低(離散度較低)。