PCG 随机数生成器是否像声称的那样好?

机器算法验证 随机生成 随机性
2022-03-15 12:50:53

我需要极快的质量可接受的随机数生成器 (RNG)。这意味着 rand()%2 不应该在 0 和 1 之间交替(这完全会破坏模拟,因为在一个问题中,我确实在 rand()%2 每隔一次调用 rand() 时执行一次)。在我的模拟中,除了 rand()%2 不在 0 和 1 之间交替之外,速度绝对是最重要的标准。所以,我的要求按重要性排序是:

  1. rand()%2 应该有一个高质量的输出
  2. 速度应该非常高
  3. 随机数生成器的统计质量必须很好(不是那么重要)

我发现置换同余生成器 (PCG) 比 Mersenne Twister (MT) 快,而 Mersenne Twister 比例如 minstd_rand 快。Mersenne Twister 和 PCG 都满足 rand()%2 要求。我发现唯一比 MT 和 PCG 更快的生成器是标准线性同余生成器 (LCG),它的 rand()%2 输出很差。

因此,对于我的申请,我认为 PCG 是最佳选择。但我开始怀疑 PCG 的统计质量。

PCG网站上有一些营销但是,PCG 在知名科学期刊上没有任何论文,该论文只是预印本虽然有人说不接受这篇论文的原因是它的篇幅,但这篇博文说他们错过了一些相关的文献。

然而,Mersenne Twister 已发表在知名期刊上

所以,我的问题是,我可以相信 PCG 网站上的营销吗?当同时考虑性能和统计质量时,是否有更好的 RNG 选择?文献中是否有比 PCG 更好的东西,我认为这可能是由于 PCG 论文的评论意见造成的?

我计划将我的结果发表在有声望的科学期刊上,所以如果 RNG 发表在有声望的科学期刊上(以便我可以引用它),我将不胜感激,但如果性能比 PCG 差得多,则不会。

2个回答

其他人查看了 PCG 生成器的统计质量,发现它们很好,例如参见https://lemire.me/blog/2017/08/22/testing-non-cryptographic-random-number-generators-我的结果/在该页面上,您还将找到对其他 RNG 的引用,它们都比 MT 更快。如果发布和原始速度对您很重要,您可以使用来自http://xoroshiro.di.unimi.it/的 RNG 之一,但请注意,在 + 或 * 版本中,最低两位的质量有问题,并且是这些生成器未能通过某些测试的原因。所以你不应该使用rand() % 2来获得一个随机的布尔值。您可以改用符号测试。** 版本应该为所有位产生高质量的输出。

如果您在单个应用程序中以单流方式使用 PCG 生成器,它们或多或少都很好(尽管如果您使用大于 64 位的状态,它们会非常慢)。在所有其他情况下,应避免使用它们。您可以在这里找到非常详细的讨论:http: //prng.di.unimi.it/pcg.php

至于基准测试:由于状态大小(64 位)较小,PCG32 生成器适合单个寄存器。xoroshiro128+(或++)使用更多的寄存器,这需要时间(它们必须被加载和保存)。在微基准测试中,这不会出现,因为编译器将所有状态保存在寄存器中(这就是为什么我总是建议在应用程序内部进行基准测试)。但是请注意,对于任何科学应用来说,位的周期确实太短了。您应该有一个至少与您正在使用的输出数量的平方一样大的周期。264