2013-02-14 12 views
5

Porównuję Twister Mersenne w Javie i Matlabie. Używam tego samego materiału siewnego w obu. Moim problemem jest to, że kiedy wydrukuję dziesięć liczb z każdego generatora liczb (Mersenne Twister działający odpowiednio w Javie i Matlab), wynikowe wyjście nie wydaje się pasować. Dane wyjściowe z wersji Matlab wypisują co drugi numer z programu w Javie.Porównanie Mersenne Twister w Javie i matlab

drukuje Java:

0,417, 0,997, 0,720, 0,932, 0,0001 ..

Matlab drukuje:

0,417, 0,720, 0,0001 ..

Czy ktoś może wskazać mi właściwy kierunek, aby dowiedzieć się, dlaczego tak się dzieje? 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); 

używam standardowego wdrożenia Mersenne Twister w Matlab, Java wersja używam można znaleźć here

+0

gdzie otrzymałeś implementację java? –

+1

Istnieją 32-bitowe i 64-bitowe warianty Mersenne Twister, które produkują różne sekwencje - być może Java używa jednego, a Matlab drugiego? – DNA

+0

Przepraszamy, wydawało mi się, że przeoczę tę informację w pierwszym poście. Został zaktualizowany. Wersja Java pochodzi z [here] (http://www.cs.gmu.edu/~sean/research/mersenne/MersenneTwister.java) – user2072220

Odpowiedz

2

Wyniki Matlab rand() są wartościami 64-bitowymi double. Ale dzwonisz pod numer nextFloat(), aby uzyskać 32-bitowe wartości z Java MersenneTwister. Sprawdź, czy źródło Java - nextDouble używa dwa razy tyle losowości co nextFloat, z dwoma połączeniami do next(). Zastąp kod nextFloat() za pomocą nextDouble() w swoim kodzie Java, a wyniki powinny być lepsze.