Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Comparing the Mersenne Twister in Java and matlab

I'm comparing the mersenne twister in Java and matlab. I'm using the same seed in both. My problem is that when i print out ten numbers from each number generator (Mersenne Twister running in Java and Matlab respectively), the resulting output doesn't seem to match. The output data from the Matlab version prints out every second number from the program in Java.

Java prints:

0.417, 0.997, 0.720, 0.932, 0.0001..

Matlab prints:

0.417, 0.720, 0.0001..

Can anyone point me in the right direction to figure out why this happens?

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);

I am using the standard implementation of the Mersenne Twister in MatLab, the Java-version I am using can be found here

like image 676
user2072220 Avatar asked Nov 04 '22 04:11

user2072220


1 Answers

The Matlab rand() results are 64-bit double values. But you're calling nextFloat() to get 32-bit values from the Java MersenneTwister. Check that Java source - nextDouble uses twice as much of the randomness as nextFloat, with two calls to next(). Replace nextFloat() with nextDouble() in your TestRand Java code and your results should line up better.

like image 96
Andrew Janke Avatar answered Nov 13 '22 06:11

Andrew Janke