2013-02-14 52 views
5

我正在比較Java和matlab中的mersenne twister。我在兩個中都使用相同的種子。 我的問題是,當我從每個數字發生器(Mersenne Twister分別運行在Java和Matlab中)打印出十個數字時,結果輸出似乎不匹配。 Matlab版本的輸出數據從Java程序中打印出每個第二個數字。在Java和matlab中比較Mersenne Twister

的Java打印:

0.417,0.997,0.720,0.932,0.0001 ..

Matlab的打印:

0.417,0.720,0.0001 ..

任何人都可以指出我在正確的方向弄清楚爲什麼這哈哈ppens?

的Java:

public class TestRand { 
    static MersenneTwister r = new MersenneTwister(1); 

    public static void main(String[] args) { 

     int ant = 10; 
     float[] randt = new float[ant]; 

     for (int i = 0; i < ant; i++){ 
      randt[i] = r.nextFloat()*1; 
      System.out.println(randt[i]);  
     } 
     System.out.println("------------twist"); 
    } 
} 

Matlab的:

s = RandStream('twister','Seed',1) 
RandStream.setGlobalStream(s); 

r = 1 .* rand(1,10); 

我使用的標準執行梅森難題在MATLAB語言中,我使用了Java的版本可以發現here

+0

你從哪裏得到java實現? – 2013-02-14 14:29:35

+1

Mersenne Twister有32位和64位的變體,它們產生不同的序列 - 也許Java使用另一種,Matlab使用另一種? – DNA 2013-02-14 14:29:58

+0

對不起,我似乎忽略了最初發布的那條信息。它現在已經更新。 Java版本來自[這裏](http://www.cs.gmu.edu/~sean/research/mersenne/MersenneTwister.java) – user2072220 2013-02-14 14:30:41

回答

2

Matlab rand()結果是64位double值。但是您要求nextFloat()從Java MersenneTwister獲取32位值。檢查Java源代碼nextDouble使用兩倍於nextFloat的隨機性,兩次調用next()。在您的TestRand Java代碼中將nextFloat()替換爲nextDouble(),您的結果應該更好地排列。