一类更好的随机数发生器

2020-10-15 22:34:18

PCG是一类简单、快速、空间效率高、统计性能好的随机数生成算法。与许多通用RNG不同,它们也很难预测。

*对于PCG系列,任意k维均匀分布(以及它所隐含的巨大周期)需要PCG的扩展生成方案。基于†的优化C++实现的ChaCha条目,由Orson Peters友好地提供。

算法随机数生成器无处不在,用于各种任务,从模拟到计算创造力。了解有关算法随机数生成的更多信息...。

但是,尽管它们被广泛使用,但很可能您使用的是有缺陷的随机数生成器。

表现得像一个真实和公正的随机性来源似乎是任何随机数生成器都应该满足的基本要求,然而许多RNG没有通过随机性的统计测试。了解更多.。

通过观察少量的RNG输出,就可以预测出许多RNG。如果你用随机数来确保公平或不可预测性,那就是个问题。了解更多.。

许多RNG要么很慢,要么需要相对较大的存储量。了解更多.。

大多数流行的RNG不提供像“向前跳跃”这样有用的功能。了解更多.。

除非您使用的是非常深奥的RNG,否则您使用的RNG很可能存在这样或那样的缺陷。如果您正在使用Mersenne Twister、arc4Random、ChaCha20、Unix‘s drand48、Unix Random、Unix Rand、XorShift*、RanQ1或其他几款,您可能想知道其中的一些缺陷。了解更多.。

它真的很容易使用,但它非常灵活,并提供强大的功能(包括一些允许你执行愚蠢的聚会戏法)。了解更多.。

要解释为什么PCG系列更好,我们需要了解一些技术细节。随机数生成器有两个部分。我们可以把它们看作两个功能:

控制每次您请求随机数字时RNG的内部状态如何更改。

大多数RNG使用非常简单的输出函数。许多RNG只使用Identity函数!它们只是按原样返回状态(使得它们很容易被预测)。一些RNG组合多个简单RNG,因此具有仅将它们合并在一起的输出功能(例如,利用加法或XOR)。同样,这是一个非常简单的输出函数。

少数RNG采用相反的方法。例如,Fortuna RNG有一个普通的状态转换函数(它只是递增一个计数器),但是使用加密块密码作为输出函数。

PCG家族的观察结果是,这些方法是不平衡的,它们偏重于一方或另一方。盈科家族采取了更为平衡的方式。

PCG系列使用线性同余生成器作为状态转移函数-PCG的“CG”代表“同余生成器”。众所周知,线性同余生成器在统计上是弱的,但PCG的状态转移函数只做了一半的工作,所以它不需要是完美的。此外,LCG有许多非常有用的特性,这使它们成为一个很好的选择。

PCG在元组上使用一种称为置换函数的新技术来产生比RNG的内部状态更随机的输出。PCG的输出功能使其具有出色的统计性能,并使其很难从输出中进行预测(因此更加安全)。PCG中的“P”代表“置换的”。

就是这样。PCG论文深入描述了元组上的置换函数,以及PCG家族的不同成员使用的输出函数。

PCG博客有与PCG和随机数生成相关的主题的新发展和文章。它往往比网站的其他部分更新得更频繁。