我想知道爲什麼下面的代碼使用Mersenne Twister(在java中)總是給出相同的99個數字,無論我運行多少次。實質上它不是隨機的?MersenneTwister不給隨機數字嗎?
MersenneTwister mt = new MersenneTwister();
for(int i = 0; i<=99; i++) {
System.out.println("Next "+mt.nextDouble());
}
我想知道爲什麼下面的代碼使用Mersenne Twister(在java中)總是給出相同的99個數字,無論我運行多少次。實質上它不是隨機的?MersenneTwister不給隨機數字嗎?
MersenneTwister mt = new MersenneTwister();
for(int i = 0; i<=99; i++) {
System.out.println("Next "+mt.nextDouble());
}
TL;博士:改變你的new MersenneTwister()
到new MersenneTwister(new Date())
代替。
僞隨機數發生器使用種子來確定出來的數字的序列。如果不設置,發電機會默認設置種子。某些生成器每次默認使用不同的種子,例如使用計算機的時鐘,或者從/dev/urandom
讀取。其他人默認使用固定的種子。
這聽起來像您的發電機是使用默認固定的種子(MersenneTwister()
的文檔說‘構造並返回具有默認種子,其是恆定一個隨機數發生器’[在原始強調])。這當然會導致相同的數字流。
您應該使用的MersenneTwister(Date)
構造函數(只使用new MersenneTwister(new Date())
),或MersenneTwister(int)
一個(儘管這似乎不太理想,因爲int
只有32位寬)。
所以首先我認爲MT只是用32位序列扭曲,所以32「寬的」關鍵也不錯。其次,取決於「好」日期,你可能會得到兩個並行運行的進程的相同數字。 – chozilla
Mersenne Twister是一種從Seed中創建可預測的,隨機分配的數字的算法。在你的情況下,你需要像系統時間那樣給種子加上一個種子,或者更好地爲底層操作系統提供的隨機性來源。
Mersenne Twister只能在字節周圍混合,所以你總能從相同的種子獲得相同的結果。這很適合在遊戲中創建虛擬世界,您可以使用重新創建千兆字節的數據,只需一個小種子。這是不是創建隨機性的方法,而是從種子(可以是隨機值或可預測的值(如日期))創建隨機分佈值的一種方法。
這不是一個標準的Java類。什麼庫提供它?作爲一種猜測,我會說它每次都會以相同的價值播種。 –
http://acs.lbl.gov/software/colt/api/cern/jet/random/engine/MersenneTwister.html – SonicProtein