【发布时间】: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