测试 PRNG 的质量

Posted

技术标签:

【中文标题】测试 PRNG 的质量【英文标题】:Testing the quality of PRNGs 【发布时间】:2012-04-04 12:49:30 【问题描述】:

我正在使用 PRNG(如 Mersenne Twister 和 stdlib 的 rand() 函数),我想要一个好的测试来帮助我确定 PRNG 生成的随机数据的质量。 我使用 PRNG 生成的随机数计算了 Pi 的值,我发现 rand() 和 Mersenne Twister 非常接近以提供区别(我需要在 10 个小数点后仔细检查吗?)。

我对蒙特卡洛模拟不太了解;请让我知道一些算法/应用程序(可能是一些简单但可以提供良好推理的东西),这将有助于我在质量方面区分它们。


编辑1:我之前没有注意到,但是有一个类似的线程:How to test random numbers?

编辑 2:我无法解释 NIST 的结果,正如其中一个 cmets 所述。我从random.org 得到了视觉解释模式(如果有的话)的想法,并且因为它很简单而遵循它。如果有人可以评论我的测试过程,我会很高兴:

    使用 rand() 和 MT1997 从 [0,1] 生成 N 个随机数 如果(round(genrand_real1() / rand_0_1())) 则为红色像素,否则为黑色

据我所知,这不是一个非常精确的解决方案,但如果这提供了一个合理的估计,那么我现在可以接受这个。

【问题讨论】:

我不太确定从 伪随机数生成器 获取任何 随机数据 - 但我认为您可以使用它们实现 en.wikipedia.org/wiki/Fair_coin#Fair_results_from_a_biased_coin。 . 您是说因为 PRNG 生成的值是可预测的吗?谢谢 是的,这就是区别 - 它只是提醒您检查 PRNG 是否适合您的应用程序,并且您不需要像 random.org 这样的 TRNG 【参考方案1】:

有几种可用的统计测试套件。我编写、复制和以其他方式收集了 120 个 PRNG,并使用各种测试套件对每个 PRNG 进行了测试,每个测试套件每个 PRNG 需要 4 小时:

PractRand(标准,1 TB)在 78 个 PRNG 中发现偏差 TestU01 (BigCrush) 在 50 个 PRNG 中发现了偏见 RaBiGeTe(扩展,512 兆位,x1)在 40 个 PRNG 中发现偏差 Dieharder(自定义命令行选项)在 25 个 PRNG 中发现偏差 Dieharder(-a 命令行选项)在 13 个 PRNG 中发现偏差 NIST STS(默认,64 兆位 x128)在 11 个 PRNG 中发现偏差

其中有多少是其他测试套件都遗漏的 PRNG?

PractRand(标准,1 TB)发现了 22 种独特的偏见,属于各种类别。 RaBiGeTe(扩展,512 兆位,x1)发现了 5 个独特的偏差,全部在 LCG 和组合 LCG 中。 TestU01 BigCrush 发现了 2 个独特的偏差,都在小的混乱 PRNG 中。 没有其他测试套件发现任何独特的偏差。

简而言之,只有 PractRand、TestU01 和可能的 RaBiGeTe 值得使用。

完全披露:我编写了 PracRand,因此 PRNG 集或任何其他非定性衡量标准都可能偏向于它。

其他优势:

在我看来,PractRand 和 TestU01 的输出往往是最容易解释的。 我认为,PractRand 和 Dieharder 往往是最容易通过命令行界面进行自动化测试的方法。 只有 PractRand 和 RaBiGeTe 支持多线程测试。

其他缺点:

PractRand 需要比其他测试套件更多的输入位进行测试 - 如果您的 RNG 速度非常慢或生成的数据量受到限制,这可能会成为问题。 RaBiGeTe 和 NIST STS 都存在接口问题。 Dieharder 和 NIST STS 都存在误报问题。 在我看来,NIST STS 的界面最差。 我无法让 Dieharder 在 Windows 上编译。我设法让 TestU01 在 Windows 上编译,但它需要一些工作。 RaBiGeTe 的最新版本是封闭源代码且仅限 Windows。

测试的一组 PRNG: PRNG 集包括 1 个大型 GFSR、1 个大型 LFSR、4 个 xorshift 类型 PRNG、2 个 xorwow 类型 PRNG、3 个其他不完全 LFSR PRNG。它包括 10 个简单的 2 次幂模 LCG(丢弃低位以达到可接受的质量水平)、10 个 2 次幂模非完全 LCG 和 9 个主要基于 LCG 和非完全 LCG 的组合生成器.它包括 19 个降低强度的 CSPRNG 版本,以及一个全强度 CSPRNG。其中,14 个基于间接/动态 s-box(例如 RC4、ISAAC),4 个是 ChaCha/Salsa 参数化,其余 2 个是 Trivium 变体。它包括 11 个广泛分类为 LFib 类型或类似类型的 PRNG,不包括 LFSR/GFSR。其余(大约 35 个)是小状态混沌 PRNG,其中 10 个使用乘法,其他的仅限于算术和按位逻辑。

编辑:还有gjrand中的测试集,非常晦涩,有点奇怪,但实际上做得非常好。

此外,所有测试的 PRNG 都作为非推荐 PRNG 包含在 PractRand 中。

【讨论】:

我很乐意推荐您的答案,但是,正如所写的那样,没有证据。您能否提供支持您主张的论文链接?或者一些关于如何重复实验的说明。 没有任何证据! DieHarder 有大约 106 项测试。 PractRand 和 TestU01 是用 C 和 C++ 编写的,需要用户集成他们的生成器!迄今为止最容易使用的是 DieHarder(ubuntu 包)和 NIST STS(python UI 和实现)!我坚信你对你的工作有偏见,正如@csgillespie 在他的评论中提到的那样,你需要提供一份支持你的主张的论文!【参考方案2】:

您最好查看volume 2 of the Knuth's series。

如需更简短的阅读,请查阅数字食谱的相应章节。

如果您只对 MC 模拟的某种基线感兴趣——最好避免使用线性同余生成器,Mersenne Twister 在绝大多数情况下足够好。 p>

【讨论】:

您能否提供一个链接,以证明在蒙特卡洛模拟中最好避免 LGC 的说法? @ziggystar:好吧,你可以在 Knuth 中查找。或数字食谱。或者用谷歌搜索标准测试套件的结果,例如来自 csgillespie 的答案。【参考方案3】:

有两个用于测试随机数的标准测试套件。

    NIST 测试套件。他们有一个implementation in C. Diehard Test Suite(由 George Marsaglia 开发)。这些测试有一个C library 实现。

Dieharder 库有一个 R 接口,称为RDieHarder。该库为 NIST 和 Diehard 测试套件提供接口。

【讨论】:

我正在使用 NIST,但我认为虽然我的测试通过了,但还是有一些问题;你能帮忙吗? - 我生成了长随机值,并将它们转换为二进制并存储在文件中。假设文件中有 100 个随机数,我确实评估了 100 个并按照文档的“运行测试代码”部分中的步骤进行操作(选择生成的比特流为 10,如文档中所示)。但我看到默认测试用例的“finalAnalysisReport.txt”几乎不包含任何信息。 最好的办法是再问一个问题。 这个答案很好,但现在已经过时了。请参阅其他答案以获取更新(TL;DR:L'Ecuyer 的 TestU01 或 PractRand)。

以上是关于测试 PRNG 的质量的主要内容,如果未能解决你的问题,请参考以下文章

移动质量(MQ)测试系列

软件测试基础理论体系学习3-软件质量保证与软件测试的关系及软件测试职业

质量如何衡量测试用例质量

质量如何衡量测试用例质量

质量如何衡量测试用例质量

软件质量基础知识