如何测试随机数?

19 testing random numbers

我用matlab编写了一个程序,用来生成0到1之间的随机数.我只用matlab中的运行测试来测试它,结果是序列是随机的.我也见过直方图,他们有β分布.我想测试这个rng和其他测试,比如diehard,ent或nist,但我不知道怎么做.有人可以解释如何使用它们,或建议我一些其他随机性测试.谢谢

Joe*_*oey 9

对于大多数测试,您可以提供大型随机数文件(整数或浮点数)并对该示例文件运行各种测试.DIEHARD就是这样做的,如果我没记错的话,其他人也会这样做.如果你真的想看到你的发电机发生故障,你可以尝试使用Pierre L'Ecuyer的TestU01,它有足够的测试来让几乎每台发电机至少失败一次测试:-)

尽管如此,对于大多数测试套件而言,还有大量文档,至少我知道DIEHARD,NIST SP 800-22的测试套件以及DieHarderTestU01(链接转到文档).提供随机数进行测试的方法通常不同,但在相应的文档中提到.


use*_*668 8

可用的测试是:

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

TestU01 - http://simul.iro.umontreal.ca/testu01/tu01.html

RaBiGeTe - http://cristianopi.altervista.org/RaBiGeTe_MT/

NIST STS - http://csrc.nist.gov/groups/ST/toolkit/rng/documentation_software.html

PractRand - http://pracrand.sourceforge.net/

其中任何一个都可以测试文件中的位.一些(PractRand,Dieharder,不确定TestU01)可以测试标准输入中的数据.有些还支持将PRNG直接链接到测试套件,动态(只有RaBiGeTe提供真正支持动态链接PRNG)或静态链接.

质量不平等.如果你有足够的PRNG输出,PractRand可以最快地找到最广泛的偏差(完全diclosure:我写了PractRand),然后是TestU01.如果你没有足够的位,RaBiGeTe可能会做得更好.NIST STS和Dieharder普遍表现不佳.

界面的便利性也不相同.PractRand和Dieharder用于命令行自动化.在我看来,PractRand和TestU01往往具有最容易解释的输出.在这方面,黛安德并不差.RaBiGeTe和NIST STS,嗯......它们都促进了我认为测试结果分布过于复杂和无用的可视化.

此外,NIST STS和Dieharder都存在误报问题.

还有耳鼻喉科,目前找不到它的链接...它有一个相当方便的界面IIRC但不是很擅长找到偏见.


Ann*_*naR 6

如果您想自己测试RNG,有很多事情需要测试.以下是一些基本功能,可能会显示您的数字序列不是真正随机的,也可能与随机无法区分?

看一眼:

  1. 分发 - 您已经对您的分发做了一些分析.您希望每个可能的数字具有相同的发生概率.

  2. 循环行为 - 相同的序列会一遍又一遍地重复吗?重复序列可能很长.

  3. 重复的发生(... CBBAF F ...),三胞胎(...... CBAAA F ...)等. 在一系列随机数中,你有一定的dulplicates概率(连续两次生成相同的数字) ),三胞胎等.计算这个概率并检查你的伪随机数序列是否具有相同的重复概率?

请注意,对于大多数这些测试,您需要具有相当长的随机数序列,以便能够从统计分析中获得合理且准确的结果.

我假设peudo随机数整数序列,可以通过将[0,1]数乘以适当的常数来轻松修复.


Joe*_*orn 0

将结果限制在特定范围内(可能使用 mod 运算符),运行代码几百万次并计算您看到该范围内每个数字的次数。确保计数大致相同,并且您对任何特定值没有偏见。