5

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

Java 打印:

0.417、0.997、0.720、0.932、0.0001..

Matlab 打印:

0.417、0.720、0.0001..

谁能指出我正确的方向来弄清楚为什么会发生这种情况?

爪哇:

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 中使用 Mersenne Twister 的标准实现,我使用的 Java 版本可以在这里找到

4

1 回答 1

2

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

于 2013-03-20T23:05:38.373 回答