如何测试随机数?

时间:2009-04-22 19:12:20

标签: random testing numbers

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

9 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:7)

可用的测试是:

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都存在误报问题。

还有ENT,目前无法找到它的链接...它有一个相当方便的接口IIRC但不太擅长找到偏见。

答案 2 :(得分:6)

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

看看:

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

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

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

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

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

答案 3 :(得分:2)

对于您的特定用例,我建议将您的rng生成的01号码作为字符写入文件,然后将该文件用作测试套件程序的输入数据。

请注意,序列必须至少为1000个字符才能由STS测试。

运行时,请不要忘记使用标记-F 'a',告诉程序输入文件由ASCII 01字符组成。< / p>

我还建议您尝试使用NIST统计测试套件的this unofficial version,我在其中摆弄了原始的NIST源代码并尝试对其进行优化。

为了您的方便,这里是我建议您使用它运行测试的命令(在使用$ make从源编译程序之后):

$ ./sts -v 1 -i 32 -I 1 -w . -F 'a' /path/to/input/file

您可能希望将测试的比特流数量(由-i标志指示)增加到更大的比特流,以使用来自输入的更多数据。例如,您可以选择:

number of bitstreams = (number of 1 and 0 bits you generated) / 1048576

一旦运行了所有测试,程序将在名为result.txt的文件中生成一个报告,您可以使用该文件来评估您的rng的质量。

请注意,这个程序虽然不是NIST官方的。此外,我们的测试套件修改未经过第三方测试;所以它是AS-IS,没有任何保证。

答案 4 :(得分:1)

去年我一直在关注这个问题,我得出的结论是,在现实世界中没有标准的方法来测试随机性。我认为这才是让你感到舒服的原因。您不能证明序列是随机的,并且您不能轻易证明序列不是随机的。

(我排除了真正非随机的随机序列,比如0123456789 ......重复。)

user3535668列出了一些广为人知的测试,以及它们的一系列问题。我可以添加其他人。死硬 - 输入文件应该有多大,应该只包含32位整数? ENT - 似乎只适用于严重错误,但chi测试很有用。 NIST用户手册长度> 100页 - 祝您好运。 TestU01 - 相同的编译问题。一旦你将它拧入计算机,它是否正常运行?那你怎么能相信输出呢?你怎么知道测试是否失败了?什么级别的p或KS被认为过于极端?

我还要补充一点,你应该考虑随机测试套件的发展与真实政治。开发能够诋毁随机数生成器的测试符合学术界的自身利益。毕竟,你没有得到任何资金产生的结果说“一切都好,没有找到,不需要进一步的研究”。

读者会不同意这个前提,但我建议您考虑一下我们所生活的现实世界中发生的事情,而不是学术书架上的事情。没有标准测试。考虑: -

Random.org - 使用本科生为论文进行一些自制测试。并且基本上计算1和0的数量。耳鼻喉科做的很相似。

Hotbits--支持简单化的耳鼻喉科,以及大多数人难以执行的骇客的骇客版本,更不用说尝试理解无数的测试初始化​​者。

学术发表论文 - 很多可以求助于Knuth的着作和朴素的技巧。有些人使用上面的一些工具。有些人接受了这些套件中的一些测试失败。

我迄今为止在这个男人的宇宙中发现的唯一一个似乎带有任何实际重量的例子(即如果它失败了你就是监狱类型的重量)是英国赌博软件供应商Playtech PLC的认证。他们提供一些最大的在线博彩公司,真钱转手。他们仍然使用自制测试和Diehard测试。

我个人喜欢: -

  1. 将主题文件转换为位图以查看它
  2. 在Ultra设置上用7z压缩它以查看它是否有任何更小的
  3. 带着Diehard奔跑,寻找愚蠢的ps和KS。
  4. 我认为如果一个文件通过了我个人的1 - 3,你将很难证明其他情况。对我来说似乎是一个好的起点......

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我可能会去的路线是对结果进行可视化分析。这个代码很简单,如下面基于t his article的psudo代码所示。

1. Create an image of size x by y
2. For ndx = 0 to x
  3. For ndy = 0 to y
    4. Let random be a random number between 0 and 1
    5. If random = 1, set the image point at ndx, ndy as black
6. Display the generated image

此外,Random.org对算法的统计分析有more information,但他们也使用上述文章作为视觉分析的例子。

答案 7 :(得分:0)

我实际上正在寻找类似的测试,希望能在这里找到它但却没有。我会尝试math.stackoverflow.com,我可能会问它,因为答案是统计的。

我的统计知识足够温和,无法提供确切的详细信息,无法知道您要查找的内容。

基本上,您正在执行回归测试,以确定您的数字是否符合统一分布。所以我们可以创建一个卡方模型(我认为)。它将导致获得t-stat和p值。较高的t-stat和较低的p值意味着它不符合分布(因此我们拒绝零假设)。 p值介于0和1之间。如果是0.06,那么我们可以以94%的置信度拒绝零假设。

回答那些说“我们不应该创建随机数”的人,也许不是实际的随机数,但我们可能会获得数据并希望测试它是否适合均匀分布,对于程序员我们可能希望测试如果哈希函数在我们正在散列的对象的大量随机实例中产生均匀分布。

对于NIST测试的一些代码,这里有一些:

http://sourceforge.net/projects/randomanalysis/

可能会给你你想要的东西。

答案 8 :(得分:-3)

@Anna我和你有同样的问题,现在已经发现了Diehard,感谢其他一些答案。

我的RNG的情况是它创建1和0并将它们存储在ASCII文件中。当尝试将此文件上传到在线随机性测试时,它失败了 - 很可能是因为数据需要采用二进制格式。

Diehard确实如此。如果您安装了Diehard,您将找到一个名为DIEHARD.DOC的文件,它会告诉您如何将ASCII文件转换为所需的二进制文件(以及您可能需要对程序进行的其他一些更改)。

无论如何,这是我的第一步。希望这有助于某人。