测试随机变量生成算法


Answers:


9

死硬测试套件是一些接近一个黄金标准测试的随机数发生器。它包括许多测试,其中一个好的随机数生成器应根据某种已知分布生成结果分布,然后可以将使用测试生成器的结果与该已知分布进行比较。

编辑

由于我的说法不对,因此我必须进行更新:Diehard可能仍会经常使用,但不再维护且不再是最新技术。此后,NIST提出了一系列改进的测试


9

Diehard测试套件(由George Marsaglia开发)是PRNG的标准测试,这只是在给honk的答案增加了一点。

有一个不错的Diehard C库,可让您访问这些测试。除标准的Diehard测试外,它还为其他一些PRNG测试(包括(其中包括)检查位顺序)提供了功能。还可以测试RNG的速度并编写自己的测试。

Dieharder库有一个R接口,称为RDieHarder

library(RDieHarder)
dhtest = dieharder(rng="randu", test=10, psamples=100, seed=12345)
print(dhtest)

Diehard Count the 1s Test (byte)

       data:  Created by RNG `randu' with seed=12345, 
              sample of size 100 p-value < 2.2e-16

这表明RANDU RNG生成器未通过最小距离/ 2dsphere测试。


8

为了测试由随机数生成器生成的数字,Diehard测试是一种实用的方法。但是这些测试似乎是任意的,可能不知道是否应该包含更多的测试,或者是否有任何方法可以真正检查随机性。

定义随机序列的最佳人选似乎是Martin-Löf随机性。这种随机性的主要思想在Knuth的3.5节中得到了很好的发展,目的是测试随机数序列的所有子序列的均匀性。正确地理解所有类型的子序列定义确实非常困难,即使使用可计算性的概念也是如此。

Diehard检验只是人们可能考虑的一些子序列,它们的失败会排除Martin-Löf随机性。


4

您无法证明,因为这是不可能的。您只能检查是否存在任何令人尴尬的自相关或分布干扰,实际上Diehard是它的标准。这是为了统计/物理,密码学家还将主要检查(除其他事项外)使生成器适合数据以获取未来值的难度。


4

小幅盘整科林的帖子:在CRAN包 RDieHarder对界面 DieHarder,死硬重写/扩展/大修所做罗伯特·布朗(谁好心名单我基于我的RDieHarder包装合着者)与大卫·鲍尔最近的贡献。

除其他外,DieHarder包括Mark帖子中提及的NIST测试以及一些新测试。这是正在进行的研究,已经有一段时间了。我在useR上发表了演讲!关于RDieHarder的2007年,您可以从这里获得。


3

得出抽象的东西是“随机”的结论很少有用。更多时候,您想测试它是否具有某种随机结构。例如,您可能想测试某事物是否具有均匀分布,并且所有值在一定范围内的可能性均等。或者,您可能想测试某事物是否具有正态分布等。要测试数据是否具有特定的分布,可以使用拟合优度检验,例如卡方检验或Kolmogorov-Smirnov检验。


3

测试随机数生成器有两个部分。如果只考虑测试统一生成器,那么可以,像DIEHARD测试套件之类的东西是个好主意。

但是通常您需要测试统一生成器的转换。例如,您可以使用统一生成器来创建指数或正态分布的值。您可能有一个高质量的统一生成器-说您有一个著名的算法,例如Mersenne Twister的可信实现-但您需要测试转换后的输出是否具有正确的分布。在这种情况下,您需要进行某种拟合优度检验,例如Kolmogorov-Smirnov。但是对于初学者来说,您可以验证样本均值和方差是否具有您期望的值。

大多数人不会-也不应该-从头开始编写自己的统一随机数生成器。很难写出一个好的生成器,并且很容易愚弄自己以为自己编写了一个好的生成器。例如,唐纳德·克努斯(Donald Knuth)在TAOCP第2卷中讲述了他写的一个随机数生成器的故事,事实证明这很糟糕。但是人们通常必须编写自己的代码才能从新的发行版中产生随机值。


2

NIST发布的统计测试列表与下一个参考实现

也有 一些聪明人的TestU01,包括受人尊敬的PRNG研究人员Pierre L'Ecuyer。同样,在C中有一个参考实现。

正如其他评论者所指出的那样,这些用于测试伪随机位的生成。如果将这些位转换为其他随机变量(例如,将Box-Muller变换从统一变换为法线),则需要进行其他测试以确认变换算法的正确性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.