有几个可用的统计测试套件。我编写、复制和以其他方式收集了 120 个 PRNG,并使用各种测试套件对每个 PRNG 进行了测试,每个测试套件每个 PRNG 需要 4 小时:
其中有多少是其他测试套件都错过的 PRNG?
- PractRand(标准,1 TB)在各种类别中发现了 22 个独特的偏见。
- RaBiGeTe(扩展,512 兆位,x1)发现了 5 个独特的偏差,都在 LCG 和组合 LCG 中。
- TestU01 BigCrush 发现了 2 个独特的偏差,都是在小的混乱 PRNG 中。
没有其他测试套件发现任何独特的偏差。
简而言之,只有 PractRand、TestU01 和可能的 RaBiGeTe 值得使用。
全面披露:我写了 PractRand,因此 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 次幂模数 not-quite-LCG,以及 9 个主要基于 LCG 和 not-quite-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 中。