【问题标题】:Comparing the Mersenne Twister in Java and matlab比较 Java 和 matlab 中的 Mersenne Twister
【发布时间】:2013-01-30 09:03:23
【问题描述】:

我正在比较 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..

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

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

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

【问题讨论】:

  • 你从哪里得到的 java 实现?
  • Mersenne Twister 有 32 位和 64 位变体,它们产生不同的序列 - 也许 Java 使用一种,而 Matlab 使用另一种?
  • 对不起,我在最初的帖子中似乎忽略了那条信息。现在已经更新了。 Java 版本来自here
  • 我猜这与算法的不同实现有关。最好的解决方案是联系 Java 类的作者 (cs.gmu.edu/~sean/research) 或联系 Mathworks,因为公众可能无法获得他们如何实现随机数生成器的确切细节。
  • 请注意,Java 代码只生成单精度值,因此每个生成的值只需要 24 位随机流。我的猜测是,Java 代码中的每个样本都使用从 MT 生成的下一个 32 位值,而 Matlab 中的每个(可能是双精度)值是由两个连续的 32 位 MT 值构成的。

标签: java matlab random mersenne-twister


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-01-23
    • 2014-02-22
    • 2013-10-13
    • 2014-04-17
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 2016-02-21
    相关资源
    最近更新 更多