我正在玩PRNG(如Mersenne Twister和stdlib的rand()
功能),我想要一个好的测试,这将有助于我确定PRNG产生的随机数据的质量。
我使用PRNG生成的随机数计算了Pi的值,我发现rand()
和Mersenne Twister非常接近以提供区别(我需要在10个小数点后仔细检查吗?)。
我对蒙特卡罗模拟没有太多了解;请让我知道一些算法/应用程序(可能是一些简单但可以提供良好推论的东西),这有助于我在质量方面区分它们。
编辑1:之前我没有注意到,但有一个类似的主题:How to test random numbers?
编辑2:我无法解释其中一条评论中提到的NIST的结果。我从random.org得到了这种从视觉上解释模式(如果有的话)的想法,并因为它的简单性而遵循它。如果有人可以评论我的测试过程,我会很高兴:
(round(genrand_real1() / rand_0_1()))
则为红色像素,否则为黑色据我所知,这不是一个非常精确的解决方案,但如果这提供了一个合理的估计,那么我现在可以忍受这个。
答案 0 :(得分:10)
有几种统计测试套件可用。我编写,复制并以其他方式收集了120个PRNG,并使用各种测试套件进行测试,每个测试套件每个PRNG花费4小时:
有多少人参加了PRNG,其他测试套件都错过了?
简而言之,只有PractRand,TestU01和可能的RaBiGeTe值得使用。
完全披露:我写了PractRand,因此PRNG或其他任何非定性测量都可能偏向于它。
其他优势:
其他缺点:
测试的一组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)
有两种标准测试套件可用于测试随机数。
Dieharder库有一个R接口,名为RDieHarder。该库为NIST和Diehard测试套件提供了一个接口。
答案 2 :(得分:0)
你最好调查volume 2 of the Knuth's series。
如需更短的读数,请查看数字配方的相应章节。
如果你只对MC模拟的某种基线感兴趣 - 最好避免使用线性同余生成器,在绝大多数情况下,Mersenne Twister 足够好。