我用matlab编写了一个程序,它可以生成0到1之间的随机数。我只用matlab中的runtest对其进行了测试,结果是序列是随机的。我也看过直方图,它们有一个 beta 分布。我想用其他测试来测试这个 rng,比如 diehard、ent 或 nist,但我不知道如何。有人可以解释如何使用它们,或者建议我进行其他一些随机性测试。谢谢你
9 回答
对于大多数测试,您可以提供一个大的随机数文件(整数或浮点数)并在该示例文件上运行各种测试。如果我没记错的话,DIEHARD 就是这样工作的,其他一些人也是。如果你真的想看到你的生成器失败,你可以尝试使用Pierre L'Ecuyer 的TestU01,它有足够的测试让几乎每个生成器都至少失败一个测试:-)
尽管如此,对于大多数测试套件来说,都有大量的文档,至少我知道DIEHARD,来自NIST SP 800-22以及DieHarder和TestU01的测试套件(链接到文档)。提供随机数进行测试的方法通常不同,但在各自的文档中有所提及。
可用的测试有:
顽固分子 - 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 可以最快地找到最广泛的偏差(完全披露:我写了 PractRand),其次是 TestU01。如果您没有足够的位,RaBiGeTe 可能会做得更好。NIST STS 和 Dieharder 通常表现不佳。
界面的便利性也不尽相同。PractRand 和 Dieharder 是为命令行自动化而设置的。在我看来,PractRand 和 TestU01 往往具有最容易解释的输出。在这方面,Dieharder 也不错。RaBiGeTe 和 NIST STS,嗯……他们都提倡在我看来过于复杂和无用的测试结果分布的可视化。
此外,NIST STS 和 Dieharder 都存在误报问题。
还有 ENT,目前找不到它的链接……它有一个相当方便的接口 IIRC,但不太擅长发现偏见。
如果你想自己测试你的RNG,有很多东西需要测试。这里有一些基本特征可能会揭示您的数字序列不是真正随机的,或者可能与随机无法区分?
看一眼:
分布- 你已经对你的分布做了一些分析。您希望每个可能的数字具有相同的发生概率。
循环行为- 相同的序列会一遍又一遍地重复吗?重复序列可能很长。
重复的出现 (...CBBAF F...) ,三胞胎 (...CBAAA F...) 等。 从统计上,在随机数序列中,您有一定的重复概率(相同的数字连续两次生成) )、三元组等。计算这个概率并检查你的伪随机数序列是否具有相同的重复发生概率?
请注意,对于大多数这些测试,您需要有相当长的随机数序列,以便能够从统计分析中获得合理和准确的结果。
我假设整数的伪随机数序列,这很容易通过将 [0, 1] 数字乘以适当的常数来修复。
对于您的特定用例,我建议将您的 rng 生成的0
和1
数字作为字符写到文件中,然后将该文件用作测试套件程序的输入数据。
请注意,序列必须至少有 1000 个字符长才能由 STS 测试。
当你运行它时,不要忘记使用 flag -F 'a'
,告诉程序输入文件是由 ASCII0
和1
字符组成的。
我还建议尝试这个非官方版本的 NIST 统计测试套件,我在其中修改了原始 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 官方的。此外,我们的测试套件修改没有经过第 3 方测试;所以它是原样的,没有任何保证。
我实际上正在寻找类似的测试,希望在这里找到它但没有。我会试试 math.stackoverflow.com,因为答案是统计的,所以我可能会问它。
我的统计知识足够温和,可以在无法提供确切细节的情况下知道您要查找的内容。
本质上,您正在执行回归测试,以确定您的数字是否符合均匀分布。所以我们可以创建一个卡方模型(我认为)。它将导致获得 t-stat 和 p-value。较高的 t-stat 和较低的 p 值意味着它不符合分布(因此我们拒绝原假设)。p 值将介于 0 和 1 之间。如果是 0.06,那么我们可以以 94% 的置信度拒绝原假设。
并回答那些说“我们不应该创建随机数”的人,也许不是实际的随机数,但我们可能会获取数据并希望测试它是否符合均匀分布,对于程序员,我们可能希望测试哈希-function 在我们正在散列的对象的大量随机实例中产生均匀分布。
至于 NIST 测试的一些代码,这里有一些:
http://sourceforge.net/projects/randomanalysis/
这可能会给你你想要的。
去年我一直在研究这个问题,我得出的结论是,在现实世界中没有测试随机性的标准方法。我认为这只是让您感到舒适的原因。你不能证明一个序列是随机的,你也不能轻易地证明一个序列不是随机的。
(我排除了真正不是随机的随机序列,比如 0123456789...重复。)
user3535668 列出了一些广为人知的测试,以及它们的完整问题列表。我可以添加其他人。顽固 - 输入文件应该有多大,它应该只包含 32 位整数吗?ENT - 似乎只适用于严重错误,但 chi 测试很有用。NIST 用户手册超过 100 页——祝你好运。TestU01 - 相同的编译问题。一旦你把它硬塞进你的电脑,它运行正常吗?那么你怎么能相信输出呢?你怎么知道测试是否失败?什么水平的 p 或 KS 被认为过于极端?
我还要补充一点,您应该考虑相对于现实政治的随机性测试套件的开发。开发诋毁随机数生成器的测试符合学者的自身利益。毕竟,你不会得到任何资金来产生“一切正常,没有发现,不需要进一步研究”的结果。
读者会不同意这个前提,但我建议你考虑一下我们生活的现实世界中发生的事情,而不是学者的书架上发生的事情。没有标准的测试。考虑:-
Random.org - 使用本科生为论文进行了一些自制测试。并且基本上计算 1 和 0 的数量。耳鼻喉科类似。
Hotbits - 支持简单的 ENT,以及大多数人难以执行的黑客版本的 Dieharder,更不用说尝试理解无数的测试初始化程序了。
学术生成器论文 - 很大程度上依赖于 Knuth 的著作和朴素的技术。有些人使用上述一些工具。然后有些人接受这些套件中的许多测试失败。
到目前为止,我在这个人的世界中发现的唯一一个似乎可以承受任何实际重量的例子(即,如果它失败了,你会去监狱类型的重量)是英国赌博软件供应商 Playtech PLC 的认证。他们为一些最大的在线博彩公司提供真钱易手的服务。尽管如此,他们仍然使用自制测试和 Diehard 测试。
我个人喜欢:-
- 将主题文件转换为位图查看
- 在 Ultra 设置下用 7z 压缩它,看看它是否变小了
- 对它进行顽固的奔跑并寻找愚蠢的ps和KS。
我认为如果一个文件通过了我个人的 1-3,你将很难证明不是这样。在我看来,这是一个很好的起点……
将结果限制在特定范围内(可能使用 mod 运算符),运行代码几百万次并计算您在该范围内看到每个数字的次数。确保计数大致相同,并且您对任何特定值都没有偏见。
@Anna我和你有同样的问题,现在由于其他一些答案而发现了顽固分子。
我的 RNG 的情况是它创建 1 和 0 并将它们存储在 ASCII 文件中。尝试将此文件上传到在线随机性测试时,它失败了——很可能是因为数据需要采用二进制格式。
Diehard 的情况确实如此。如果您安装了 Diehard,您会发现一个名为的文件,它会DIEHARD.DOC
告诉您如何将 ASCII 文件转换为所需的二进制文件的步骤(以及您可能需要对程序进行的一些其他更改)。
无论如何,这是我的第一步。希望这可以帮助某人。