测试PRNG的质量

时间:2012-03-20 01:28:19

标签: random montecarlo mersenne-twister

我正在玩PRNG(如Mersenne Twister和stdlib的rand()功能),我想要一个好的测试,这将有助于我确定PRNG产生的随机数据的质量。 我使用PRNG生成的随机数计算了Pi的值,我发现rand()和Mersenne Twister非常接近以提供区别(我需要在10个小数点后仔细检查吗?)。

我对蒙特卡罗模拟没有太多了解;请让我知道一些算法/应用程序(可能是一些简单但可以提供良好推论的东西),这有助于我在质量方面区分它们。


编辑1:之前我没有注意到,但有一个类似的主题:How to test random numbers?

编辑2:我无法解释其中一条评论中提到的NIST的结果。我从random.org得到了这种从视觉上解释模式(如果有的话)的想法,并因为它的简单性而遵循它。如果有人可以评论我的测试过程,我会很高兴:

  1. 使用rand()和MT1997
  2. 从[0,1]生成N个randoms
  3. 如果(round(genrand_real1() / rand_0_1()))则为红色像素,否则为黑色
  4. 据我所知,这不是一个非常精确的解决方案,但如果这提供了一个合理的估计,那么我现在可以忍受这个。

3 个答案:

答案 0 :(得分:10)

有几种统计测试套件可用。我编写,复制并以其他方式收集了120个PRNG,并使用各种测试套件进行测试,每个测试套件每个PRNG花费4小时:

  • PractRand(标准,1 TB)在78个PRNG中发现了偏见
  • TestU01(BigCrush)发现了50个PRNG的偏见
  • RaBiGeTe(扩展,512兆位,x1)在40个PRNG中发现偏见
  • Dieharder(自定义命令行选项)在25个PRNG中发现了偏见
  • Dieharder(-a命令行选项)在13个PRNG中发现了偏见
  • NIST STS(默认为64兆位x128)在11个PRNG中发现偏见

有多少人参加了PRNG,其他测试套件都错过了?

  • PractRand(标准,1 TB)发现了22种独特的偏见,种类繁多。
  • RaBiGeTe(扩展,512兆位,x1)发现了5种独特的偏差,全部采用LCG和组合LCG。
  • TestU01 BigCrush在小混乱的PRNG中发现了2个独特的偏见 没有其他测试套件发现任何独特的偏见。

简而言之,只有PractRand,TestU01和可能的RaBiGeTe值得使用。

完全披露:我写了PractRand,因此PRNG或其他任何非定性测量都可能偏向于它。

其他优势:

  • 在我看来,PractRand和TestU01往往是最容易解释输出的。
  • PractRand和Dieharder往往是最简单的自动化测试通过命令行界面我认为。
  • PractRand和RaBiGeTe是唯一支持多线程测试的人。

其他缺点:

  • PractRand需要比其他测试套件更多的输入测试 - 如果您的RNG非常慢或者产生的数据量有限,则可能会出现问题。
  • RaBiGeTe和NIST STS都有接口问题。
  • Dieharder和NIST STS都存在误报问题。
  • 我认为NIST STS界面最差。
  • 我无法让Dieharder在Windows上编译。我设法让TestU01在Windows上编译,但它需要一些工作。
  • 最新版本的RaBiGeTe是闭源和仅限Windows。

测试的一组PRNG: PRNG集包括1个大型GFSR,1个大型LFSR,4个xorshift型PRNG,2个xorwow型PRNG,以及3个其他非完全LFSR PRNG。它包括10个简单的2次幂模数LCG(丢弃低位以达到可接受的质量水平),10个2次方模数不完全LCG,以及9个主要基于LCG和非LCG的组合发生器。它包括19种强度降低的CSPRNG,以及一种全强度CSPRNG。其中,14个基于间接/动态s-box(例如RC4,ISAAC),4个是ChaCha / Salsa参数化,其余2个是Trivium变体。它包括11个广泛分类为LFib类型或类似的PRNG,不包括LFSR / GFSR。其余的(约35个)是小状态混沌PRNG,其中10个使用乘法而其他仅限于算术和按位逻辑。

编辑: gjrand中还有一个测试集,这个测试集非常模糊,有点奇怪,但实际上确实非常好。

此外,所有测试的PRNG都作为非推荐的PRNG包含在PractRand中。

答案 1 :(得分:4)

有两种标准测试套件可用于测试随机数。

  1. NIST测试套件。他们有implementation in C.
  2. Diehard Test Suite(由George Marsaglia开发)。这些测试有C library个实现。
  3. Dieharder库有一个R接口,名为RDieHarder。该库为NIST和Diehard测试套件提供了一个接口。

答案 2 :(得分:0)

你最好调查volume 2 of the Knuth's series

如需更短的读数,请查看数字配方的相应章节。

如果你只对MC模拟的某种基线感兴趣 - 最好避免使用线性同余生成器,在绝大多数情况下,Mersenne Twister 足够好