哪些方法用于测试随机变量生成算法?
哪些方法用于测试随机变量生成算法?
Answers:
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测试。
为了测试由随机数生成器生成的数字,Diehard测试是一种实用的方法。但是这些测试似乎是任意的,可能不知道是否应该包含更多的测试,或者是否有任何方法可以真正检查随机性。
定义随机序列的最佳人选似乎是Martin-Löf随机性。这种随机性的主要思想在Knuth的3.5节中得到了很好的发展,目的是测试随机数序列的所有子序列的均匀性。正确地理解所有类型的子序列定义确实非常困难,即使使用可计算性的概念也是如此。
Diehard检验只是人们可能考虑的一些子序列,它们的失败会排除Martin-Löf随机性。
您无法证明,因为这是不可能的。您只能检查是否存在任何令人尴尬的自相关或分布干扰,实际上Diehard是它的标准。这是为了统计/物理,密码学家还将主要检查(除其他事项外)使生成器适合数据以获取未来值的难度。
测试随机数生成器有两个部分。如果只考虑测试统一生成器,那么可以,像DIEHARD测试套件之类的东西是个好主意。
但是通常您需要测试统一生成器的转换。例如,您可以使用统一生成器来创建指数或正态分布的值。您可能有一个高质量的统一生成器-说您有一个著名的算法,例如Mersenne Twister的可信实现-但您需要测试转换后的输出是否具有正确的分布。在这种情况下,您需要进行某种拟合优度检验,例如Kolmogorov-Smirnov。但是对于初学者来说,您可以验证样本均值和方差是否具有您期望的值。
大多数人不会-也不应该-从头开始编写自己的统一随机数生成器。很难写出一个好的生成器,并且很容易愚弄自己以为自己编写了一个好的生成器。例如,唐纳德·克努斯(Donald Knuth)在TAOCP第2卷中讲述了他写的一个随机数生成器的故事,事实证明这很糟糕。但是人们通常必须编写自己的代码才能从新的发行版中产生随机值。
在NIST发布的统计测试列表与下一个参考实现
也有 一些聪明人的TestU01,包括受人尊敬的PRNG研究人员Pierre L'Ecuyer。同样,在C中有一个参考实现。
正如其他评论者所指出的那样,这些用于测试伪随机位的生成。如果将这些位转换为其他随机变量(例如,将Box-Muller变换从统一变换为法线),则需要进行其他测试以确认变换算法的正确性。