如何测试伪随机数生成器?

5

最近我实现了一个64位整数(或长整型)的MersenneTwister。是否有指南或示例,以便我可以测试PRNG,以便我知道我的实现是否是足够好的解决方案。我特别关注如何验证我的实现是否具有足够好的均匀分布。

这与MersenneTwister越具体越好。

4个回答

14

你不需要测试 Mersenne Twister 算法 —— 这个已经被真正懂行的人们反复测试过了 —— 你只需要测试是否已经正确地 实现 了这个算法。

你可以前往 Mersenne Twister 网站 并获取他们的 测试输出。如果你产生了与他们相同的输出序列,那么你很可能已经正确地实现了这个算法。

请注意,MT 网站上有一个专门针对 64 位机器 的链接,并且为 32 位和 64 位版本提供不同的测试输出。


这只有一个小问题。C使用无符号64位整数。据我所知,Java实际上没有无符号的long。如果所有以这种方式生成的非负long都相同且具有相同的排序,则可以安全地假定两个实现是相同的吗? - Daniel Fath

8

PRNG的标准测试是Diehard Tests

(意思是,用于测试伪随机数生成器的标准测试是Diehard Tests。)

我不知道哪个更好,但同时使用似乎是不错的选择。 - Mars

2

如果这是真正通用的机器翻译,最简单的方法就是将其与具有相同种子的已知良好的机器翻译库进行比较。


就是这样,但有两个问题。我只知道一个MT-64库,但它没有我需要测试的所有函数(它只提供nextInt,而我已经实现了nextDouble、nextIntFromRange等)。如果我没记错的话,MT-64和MT生成的种子之间有区别,所以我不能使用第二个库(它具有所有缺失的功能)来检查它。 - Daniel Fath

1

你好!

正如其他人所说 - 使用算法的已知答案测试向量。如果你满足了测试向量,你可以相当确定你的生成器是有效的。

如果你真的想要测试生成器,请使用Dieharder工具实现的DIEHARD tests++:

http://www.phy.duke.edu/~rgb/General/dieharder.php


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接