比较Java和Matlab中的Mersenne Twister

use*_*220 5 java random matlab mersenne-twister

我正在比较Java和matlab中的mersenne twister.我在两者中使用相同的种子.我的问题是,当我从每个数字生成器打印出10个数字(分别用Java和Matlab运行的Mersenne Twister)时,结果输出似乎不匹配.来自Matlab版本的输出数据打印出Java中程序的每秒数.

Java打印:

0.417,0.997,0.720,0.932,0.0001 ..

Matlab打印:

0.417,0.720,0.0001 ..

任何人都可以指出我正确的方向来弄清楚为什么会发生这种情况?

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

Matlab的:

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

r = 1 .* rand(1,10);
Run Code Online (Sandbox Code Playgroud)

我在MatLab中使用Mersenne Twister的标准实现,我正在使用的Java版本可以在这里找到

And*_*nke 2

Matlabrand()结果是 64 位double值。但是您正在调用nextFloat()以从 Java 获取 32 位值MersenneTwister。检查 Java 源代码nextDouble使用的随机性是否是两次nextFloat调用的两倍next()。在 Java 代码中替换nextFloat()为,结果应该会更好。nextDouble()TestRand