2014-05-10 46 views
1

我想知道爲什麼下面的代碼使用Mersenne Twister(在java中)總是給出相同的99個數字,無論我運行多少次。實質上它不是隨機的?MersenneTwister不給隨機數字嗎?

MersenneTwister mt = new MersenneTwister(); 
    for(int i = 0; i<=99; i++) { 
     System.out.println("Next "+mt.nextDouble()); 
    } 
+0

這不是一個標準的Java類。什麼庫提供它?作爲一種猜測,我會說它每次都會以相同的價值播種。 –

+0

http://acs.lbl.gov/software/colt/api/cern/jet/random/engine/MersenneTwister.html – SonicProtein

回答

4

TL;博士:改變你的new MersenneTwister()new MersenneTwister(new Date())代替。

僞隨機數發生器使用種子來確定出來的數字的序列。如果不設置,發電機會默認設置種子。某些生成器每次默認使用不同的種子,例如使用計算機的時鐘,或者從/dev/urandom讀取。其他人默認使用固定的種子。

這聽起來像您的發電機是使用默認固定的種子(MersenneTwister()的文檔說‘構造並返回具有默認種子,其是恆定一個隨機數發生器’[在原始強調])。這當然會導致相同的數字流。

您應該使用的MersenneTwister(Date)構造函數(只使用new MersenneTwister(new Date())),或MersenneTwister(int)一個(儘管這似乎不太理想,因爲int只有32位寬)。

+0

所以首先我認爲MT只是用32位序列扭曲,所以32「寬的」關鍵也不錯。其次,取決於「好」日期,你可能會得到兩個並行運行的進程的相同數字。 – chozilla

1

Mersenne Twister是一種從Seed中創建可預測的,隨機分配的數字的算法。在你的情況下,你需要像系統時間那樣給種子加上一個種子,或者更好地爲底層操作系統提供的隨機性來源。

Mersenne Twister只能在字節周圍混合,所以你總能從相同的種子獲得相同的結果。這很適合在遊戲中創建虛擬世界,您可以使用重新創建千兆字節的數據,只需一個小種子。這是不是創建隨機性的方法,而是從種子(可以是隨機值或可預測的值(如日期))創建隨機分佈值的一種方法。