2013-02-14 10 views
5

私はJavaとmatlabのメルセンヌツイスタを比較しています。私は両方で同じ種を使用しています。 私の問題は、各番号ジェネレータ(JavaとMatlabで動作するMersenne Twister)から10個の数字を出力すると、出力結果が一致しないように見えることです。 Matlab版の出力データは、Javaのプログラムから毎秒2つの数値を出力します。Javaとmatlabのメルセンヌツイスターの比較

の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の:私はMATLABでメルセンヌツイスターの標準実装を使用しています

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

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

、私が使用しているJavaのバージョンを見つけることができますhere

+0

ここでJavaの実装を取得しましたか? –

+1

異なるシーケンスを生成するMersenne Twisterには、32ビットと64ビットのバリエーションがあります - Javaでは1つを使用し、もう1つはMatlabを使用するでしょうか? – DNA

+0

申し訳ありませんが、最初の投稿でその情報を見逃してしまったようです。今更新されました。 Javaのバージョンは[here](http://www.cs.gmu.edu/~sean/research/mersenne/MersenneTwister.java)から入手しました – user2072220

答えて

2

Matlab rand()の結果は、64ビットdoubleの値です。しかし、Java MersenneTwisterから32ビットの値を取得するには、nextFloat()を呼び出しています。 Javaソース - nextDoublenextFloatの2倍のランダム性を使用し、2回の呼び出しでnext()が使用されていることを確認してください。 TestRand JavaコードでnextFloat()nextDouble()と交換してください。結果がより良く整理されるはずです。