
从预测星系混沌的舞蹈到为复杂的金融衍生品定价,现代科学依赖于一个根本性的悖论:迫使作为逻辑和秩序典范的计算机产生随机性。这种随机性的幻象是由被称为伪随机数生成器(PRNGs)的算法精心编排的,它们是模拟复杂系统不可或缺的工具。然而,这种依赖性也带来了一个关键的脆弱性;一个有缺陷的生成器,一个带有隐藏模式或偏差的生成器,可能会系统性地破坏科学结果,并导致危险的错误结论。因此,理解好的和坏的随机性幻象之间的区别并非学术上的好奇,而是可靠计算科学的先决条件。
本文为伪随机数生成的世界提供了一份全面的指南。在第一章 原理与机制 中,我们将拆解这些生成器的内部机制,探索诸如种子、周期和等分布等概念,以理解是什么将高质量的幻象与危险的幻象区分开来。随后,在 应用与跨学科联系 中,我们将穿越粒子物理学、生物学到金融学等不同领域,见证这些数字流如何驱动发现,以及为什么它们的完整性对科学进步至关重要。
在大量计算探索的核心,从模拟恒星动荡的核心到为奇异金融工具定价,都存在一个引人入胜的悖论:从一台完全确定性机器的齿轮中创造出偶然性。我们要求我们的计算机——逻辑和可预测性的典范——给我们一些在所有意图和目的上都是随机的东西。这怎么可能呢?答案在于 伪随机数生成 这个优雅的领域,这是一门既是艺术又是严谨数学的学科。
首先,让我们做一个关键的区分。真随机性 是物理世界的一种属性。它源于我们认为从根本上无法预测的现象,例如电子的量子抖动或放射性原子衰变的确切时刻。我们可以构建硬件从自然界中收集这种熵,但这可能既缓慢又繁琐。对于大多数计算科学,我们转向一种巧妙的替代品:伪随机性。
伪随机数生成器(PRNG)是一种算法,一个发条装置。它操作一组隐藏的数字,称为其 内部状态。每次我们请求一个新的随机数时,生成器执行两个步骤:
关键在于,这个过程是完全确定性的。如果你知道转移规则和当前状态,你就能预测该生成器将产生的每一个未来数字。那么“随机性”从何而来呢?它来自初始状态,一个我们称之为 种子 的值。
想象一个随时间演变的简单模型,如 。这是确定性的;从 开始,未来是固定的。现在想象一个“随机”模型,,其中 是每一步的“随机”扰动。如果我们使用PRNG生成 ,那么整个扰动序列都由种子预先决定。在同一台机器上使用相同种子运行的这个随机模型的两次模拟,将产生完全相同的“随机”轨迹,精确到每一位。
这个特性,称为 可复现性,不是一个缺陷;它是一种科学上的超能力。它使我们能够调试复杂的代码,验证结果,并充满信心地在先前工作的基础上继续构建,将一个看似混沌的过程转变为一个可重复的实验。整个复杂的偶然之舞都由一个单一的数字编排:种子。
当然,一个确定性序列只有在它能很好地模仿真随机性时才有用。一个“坏”的PRNG可能比无用更糟糕——它可能具有危险的误导性,在你的数据中悄悄植入虚假模式,将你的科学探究引向歧途。那么,我们对高质量的PRNG有哪些要求呢?
因为PRNG的状态存储在有限数量的比特中,所以可能的状态数量是有限的。迟早,生成器必须返回到它之前访问过的一个状态。一旦发生这种情况,确定性规则保证整个状态和输出序列将完全重复,就像以前一样。这个重复序列的长度称为 周期。
对PRNG最明显的要求是,其周期必须是天文数字级的长,远长于我们可能执行的任何计算。对于一个需要 个随机数的模拟,我们需要周期 。
如果这个条件被违反会发生什么?后果是灾难性的。想象一个蒙特卡洛模拟运行了很长时间,远长于PRNG的周期()。在第一个周期之后,模拟不再探索新的可能性。它只是在重蹈覆辙,对同一组 个点上的相同函数值进行反复平均。模拟的统计性质消失了。蒙特卡洛估计量本应是一个收敛到真实答案的随机变量,现在却坍缩成一个固定的、确定性的数字——即那单个周期点上的平均值。
这个误差不再是随着样本增多而减少的 统计抽样误差。它是一个固定的、系统性的偏差。PRNG的有限周期实际上用一个仅有 个点的离散网格取代了我们希望探索的连续空间。这个误差现在是一个 截断误差,类似于用一组粗糙的直线来近似一条平滑曲线。增加样本数量 对减少这个误差毫无作用。你只是在用越来越大的虚假信心反复测量那几个相同的点。
长周期是必要的,但远非充分条件。周期内的数字也必须分布良好。如果我们绘制一个优秀生成器产生的数百万个数字的直方图,它应该几乎是完全平坦的,0到1之间的每个值出现的可能性都相等。
但真正的考验来自更高维度。在许多模拟中,我们分组使用随机数。例如,在Metropolis蒙特卡洛算法中,我们可能用几个数字来为一个三维空间中的粒子提议一个随机移动,再用另一个数字来决定是否接受该移动。假设我们成对使用它们,,并将它们作为单位正方形中的点绘制出来。一个好的生成器会用均匀的薄雾填满正方形。然而,一个坏的生成器会揭示一个惊人的秘密:所有的点都落在少数几条平行的线上。如果我们以三元组的形式取数,坏生成器产生的点可能都位于一个立方体内的几个平行平面上。这就是劣质生成器臭名昭著的“晶格结构”。
这种在高维空间中 等分布性 的失败意味着生成器在结构上无法探索所有可能性的整个空间。它引入了盲点,即模拟永远无法访问的区域。如果你的模拟的“正确”答案恰好位于这些盲点之一,那么无论你运行多久,你的结果都将是系统性错误的。我们有像 谱检验 这样的数学工具,以及像卡方检验(检查微小超立方体的占用率)这样的经验方法,来在这些维度缺陷造成危害之前诊断它们。
最后,PRNG产生的每个数字都应该像一个全新的惊喜。连续输出之间不应有可辨别的模式或相关性。一个微小的相关性可能是毁灭性的。例如,如果一个生成器有轻微的偏向,倾向于产生较小的数字,一个化学模拟可能会接受过多的高能构型,导致计算出的温度系统性地出错。
可视化此属性的一个有力方法是观察生成器对其种子的微小变化作何反应。想象一下初始化两个随机数流,一个用种子 ,另一个用种子 。一个“坏”的生成器,其输出是其状态的一个过于简单的函数,可能会产生两个几乎相同的流——它们的值高度相关。相比之下,一个“好”的生成器则采用复杂的、非线性的输出函数来打乱其内部状态的比特,确保两个流几乎瞬间发散,并表现得好像它们是完全独立的。这种去相关性是高质量的标志,向我们保证,设置中微不足道的选择不会导致我们结果中出现大的、系统性的偏差。
有了这些质量标准——长周期、良好的高维等分布性和低相关性——我们可以简要地参观一下PRNG的动物园。
线性同余生成器 (LCGs): 这些是最简单的经典生成器,由递推式 定义。它们速度快,状态极小(只有一个数字,)。然而,它们是一个警示故事。它们的周期最多为 ,对于现代需求来说太小了,并且它们在即使是中低维度下也存在严重的晶格结构问题。如今它们主要具有历史意义。
巨头:Mersenne Twister: 解决LCG困境的办法是大幅增加内部状态的大小。著名的 Mersenne Twister (MT19937) 就是一个典型的例子。它的状态是惊人的624个数字(近20,000比特)。这赋予了它一个巨大到难以想象的周期(),并保证了在高达623维的空间中具有出色的等分布性。多年来,它一直是要求苛刻的科学模拟的黄金标准。
现代快车:xorshift 和 PCG: Mersenne Twister的巨大状态虽然提供了卓越的质量,但可能成为性能瓶颈。新一代的生成器,如 xorshift 和 Permuted Congruential Generator (PCG) 家族,提供了一个出色的权衡。它们使用较小的状态(也许128比特),但通过结合极快的位运算(移位和异或)和一个精心设计的非线性输出函数来消除相关性,从而获得了优异的统计特性。它们的速度和质量使它们成为当今许多应用中的默认选择。然而,必须记住,它们的可预测性使得它们以及这里讨论的所有其他生成器,完全不适用于涉及对手的密码学目的。
在并行计算时代,我们不再在单个处理器上运行模拟。我们使用成千上万个处理器。这就提出了一个新问题:你如何同时为成千上万个处理器提供独立的随机数流?
幼稚的方法充满了危险。如果所有线程共享一个没有同步“锁”的生成器,它们会相互践踏对方的状态更新,产生一串混乱而无意义的输出。如果它们共享一个受锁保护的生成器,代码会变得安全但缓慢,因为线程被迫排队等待,这违背了并行的初衷。一个特别诱人且危险的陷阱是给每个线程自己的生成器实例,并用简单的连续数字如 作为种子。对于许多PRNG来说,这些流并非独立的,实际上是高度相关的,重新引入了我们试图避免的偏差。
正确而优雅的解决方案是使用专门为并行使用而设计的生成器。这些生成器允许将其单一的、巨大的序列分割成大量长的、可证明不重叠的 子流。然后,我们可以给我们成千上万个处理器中的每一个分配其自己的个人子流,并有数学保证它永远不会与任何其他子流重叠或相关。这种“流分割”或“跳步法”的行为确保了整个并行计算的统计完整性得以维持,使我们能够充分利用现代硬件的全部力量,而不会损害我们的结果。
从一个种子和一个递推规则的简单发条装置中,涌现出丰富而深刻的理论,使我们能够创造、测试和部署高质量的偶然性幻象,为整个科学领域的发现提供动力。
我们花了一些时间来理解伪随机数生成器的机制——这些确定性的小引擎能 churn 出一系列数字,我们希望这些数字在世人看来,就像一个真正随机过程的不可预测的结果。这本身就是一个引人入胜的话题,是数论、计算机科学和统计学的一个奇妙交集。但真正的冒险始于我们将这些工具从数学家的工作室中取出并投入使用。我们能用它们来 做 什么?事实证明,我们几乎可以用它们做任何事情。我们可以用它们来探索宇宙,从亚原子粒子的舞蹈到宇宙演化的宏大画卷,所有这些都无需离开我们的办公桌。我们可以用它们来构建更好、更快、更安全的计算机。我们甚至可以用它们来窥探生命本身的运作方式。
其基本思想是整个科学界最强大的思想之一:模拟。如果一个系统太大、太小、太快、太慢或太危险而无法直接研究,我们可以在计算机中构建一个遵循相同规则的“玩具宇宙”。而这些宇宙的规则往往包含偶然性因素。伪随机数生成器就是我们的骰子、我们的硬币、我们的转盘——它是我们计算世界中所有偶然性的来源。但这提出了一个极其重要的问题:如果我们的骰子是灌铅的呢?如果我们注入模拟中的“随机性”带有隐藏的模式和秘密的偏见,会发生什么?答案是,我们的玩具宇宙会背叛我们,引导我们得出不仅错误,而且是极其巧妙地错误的结论。让我们在广阔的科学技术领域中游览一番,看看这些数字序列是多么重要——又是多么危险。
也许最经典的随机性应用范例就是所谓的蒙特卡洛方法,其最著名的拿手好戏是计算 的值。想象一个边长为一米的正方形板,在一个角上画了一个半径为一米的四分之一圆。现在,假设你闭上眼睛,一次又一次地向这个板上随机投掷飞镖。有些飞镖会落在四分之一圆内,有些会落在外面。因为你的投掷是随机的,所以落在圆内的飞镖数与投掷总数的比率将等于面积的比率:。所以,要估算 ,你只需计算击中次数,乘以四,然后除以投掷总数。
在计算机中,我们不扔实体飞镖。我们生成成对的随机坐标 并检查它们是否满足条件 。我们对 的估算质量完全取决于我们用来生成这些坐标的随机数的质量。如果我们使用高质量的生成器,比如 Permuted Congruential Generator (PCG),这些点会漂亮而均匀地填满正方形,我们的估算值会稳步收敛到 的真实值。但如果我们使用一个故意设计得有缺陷的生成器,一个连续数字之间有强相关性的生成器呢?例如,一个每个数只是前一个数加上一个小常数,并在单位区间上循环的生成器。如果我们用连续的输出来作为我们的 和 坐标,这些点将根本不会填满正方形!相反,它们会落在一系列对角线上。飞镖板上将有大片区域永远不会被击中。很自然,我们对面积的估算——从而对 的估算——将大错特错,不是因为我们的逻辑错误,而是因为我们的“随机”投掷是一场骗局。
这种“投飞镖”技术远比仅仅计算 更为通用。它是一种计算任何积分的通用方法,也就是说,用于求一个函数的平均值。我们可以通过在随机点上对系统进行抽样并对结果求平均,来估算极其复杂的计算结果。而这正是科学家们在地球上一些最先进的实验中所做的事情。
考虑高能物理学的世界,在一个像大型强子对撞机(LHC)这样的加速器中。当质子以接近光速的速度碰撞时,它们会产生壮观的新粒子阵雨。描述这些相互作用的理论,如标准模型,极其复杂。为了检验这些理论,物理学家们将探测器得到的真实数据与模拟数据进行比较。他们需要生成 数十亿 的模拟碰撞事件,每一个都是一个充满可能性的宇宙。每一个模拟事件,本质上都是一个极高维度的蒙特卡洛计算,需要一长串随机数来决定飞出的粒子的属性。
现在,想象一下在拥有数千个并行工作的处理器的超级计算机上进行这项工作。一个新的挑战出现了。不仅每一串随机数流必须在统计上完美无瑕,而且不同处理器使用的流之间必须相互独立。更糟糕的是,为了科学验证和调试,整个模拟必须是完全可复现的。这意味着模拟事件编号5,371,492必须是 完全相同 的,无论它是在今天早上由处理器A生成,还是在下周由处理器B生成。这催生了极其复杂的PRNG的开发,这些PRNG可以“跳跃”到其序列中的任何点,或者根据一个计数器来生成数字,确保任何工作单元都可以按需为任何事件生成随机数,而不会干扰任何其他工作单元。这是一项巨大的工程壮举,所有这些都是为了确保我们用来探索自然基本法则的骰子没有被动手脚。
自然不是一幅静态的画面;它是一个动态的过程,是相互作用部分随时间展开的舞蹈。随机性常常是这场舞蹈的编舞者。为了模拟它,我们需要PRNG来一步步驱动我们系统的演化。
让我们看一个简单的磁铁。在微观层面上,磁铁由无数微小的原子自旋组成,每个自旋可以指向上或下。在高温下,这些自旋是无序的,随机翻转,没有整体磁性。随着温度下降,自旋倾向于与邻居对齐。对此的模拟,即Ising模型,通过访问每个自旋并做出一个随机决定来进行:它应该翻转吗?翻转的概率取决于温度及其邻居的排列。PRNG在每一步为每个自旋做出这个决定。如果生成器是好的,模拟就能正确预测磁铁自发变得有序的温度——一个相变。但如果生成器有缺陷——例如,一个常见的错误是使用线性同余生成器并只取其低位比特,这些比特是出了名的非随机——模拟就可能被破坏。这些“随机”数中的人为模式会引入虚假的作用力,导致模拟的磁铁表现出非物理行为,改变其表观的相变温度或其稳定下来的速度 [@problem_-id:3264131]。
这个原理几乎延伸到所有材料科学和化学领域。通常,我们希望模拟原子和分子系统,不是在孤立状态下,而是如同它们在一个恒温烧杯中一样。原子的运动方程是确定性的(牛顿定律),但真实的烧杯不是一个孤立系统;它与周围环境的“热浴”接触,后者不断地摇晃原子。为了在模拟中模仿这一点,我们在原子上添加了人工摩擦和随机“踢动”。这些就是允许我们在正则系综 () 或等温等压系综 () 中运行分子动力学模拟的虚拟恒温器和恒压器。随机踢动必须具有非常特定的统计特性——它们必须是高斯“白噪声”——这由一个深刻的物理原理,即涨落耗散定理所决定。PRNG是这些踢动的来源,其在每个时间步生成真正独立的、正态分布的数字的能力,使得模拟具有物理意义。
同样的故事在生物学中上演。演化的一个核心机制是遗传漂变,即一个种群中基因频率从一代到下一代的随机波动。在一个小种群中,一个等位基因可能纯粹由于偶然性而“固定”(达到100%频率)或灭绝。我们可以用Wright-Fisher模型来模拟这个过程,其中下一代是通过从亲代的基因中随机抽样形成的。PRNG扮演着命运的角色,决定哪些个体能够传递它们的基因。通过运行这些模拟,我们可以估算一个新突变在种群中传播需要多长时间。就像磁铁一样,一个有缺陷的PRNG可能会给出这些演化动态的扭曲图像,导致对固定时间的错误估计,以及对随机漂变在塑造生命中的力量的误解。
从微观世界,我们可以跳到金融世界。股票价格的“随机游走”是现代金融理论的基石。像Geometric Brownian Motion这样的模型将价格的演化描述为一个稳定漂移和一个随机、易变分量的组合。为了给股票期权等衍生品定价,或估算投资组合的风险,金融工程师们运行这些随机微分方程(SDEs)的蒙特卡洛模拟。PRNG在每个微小的时间步长生成随机的市场“冲击”。生成器的质量对这些价值数十亿美元的计算的准确性至关重要,并且不同的应用可能有不同的需求。有时我们只需要最终平均价格是正确的(一个“弱”误差标准),而其他时候我们需要整个价格路径的轨迹在统计上是准确的(一个“强”误差标准)。
即使在纯粹的确定性系统领域,PRNG也具有不可估量的价值。考虑混沌系统,如天气,它们由表现出著名的“蝴蝶效应”——对初始条件的敏感依赖——的方程所支配。虽然从一个给定的起点开始的演化是完全确定的,但其行为如此复杂以至于看起来是随机的。为了理解这样一个系统的 典型 行为,我们不能只模拟一个轨迹。我们必须通过模拟从不同初始条件开始的许多轨迹来探索其广阔的可能性空间。我们如何选择这些起点?我们用PRNG随机抽样它们。通过这种方式,随机性成为我们探索确定性景观的向导。
到目前为止,我们已经用PRNG来模拟一个由偶然性支配的世界。但在计算机科学中,我们常常反其道而行之:我们用偶然性来构建更好的规则,设计更快、更鲁棒的算法。
一个经典的例子是像“treap”这样的随机化数据结构。标准的二叉搜索树,一种组织数据的基本方式,如果数据以排序方式插入,它可能会变得非常低效;它会退化成一个长而瘦的链条。treap通过在每个项目插入时为其分配一个随机的“优先级”来避免这种情况。然后它将结构同时维护为关于数据的搜索树和关于优先级的堆。随机优先级的效果是打乱结构,使得树极有可能保持良好平衡和高效,无论数据以何种顺序到达。随机性被用作对抗最坏情况输入的防御。
但这种防御开辟了一条新的、微妙的战线。如果一个试图攻击我们系统的对手能够 预测 我们的随机数呢?如果PRNG是可预测的(比如一个参数已知的简单LCG),对手就可以选择一个数据项序列,使其与即将到来的优先级序列巧妙地耦合。例如,他们可以安排使得具有连续较大优先级的项目也被赋予连续较大的数据键。这将再次迫使treap变成一个退化的、链状的结构,完全违背了随机化的初衷。算法的性能崩溃了。这揭示了一个关键的区别:为了在面对未知输入时获得良好性能,我们需要好的 统计 随机性。为了在面对聪明的对手时保证安全,我们需要 密码学上的不可预测性。一个密码学安全PRNG(CSPRNG)的设计使得即使对手看到了所有过去的数字,他们在猜测下一个数字时也没有任何计算上的优势。对于处于敌对环境中的随机化算法,非此不可。
模拟、随机性和安全的这种交集处于现代技术的前沿。考虑区块链和加密货币的世界。一个根本性的威胁是“双花”攻击,攻击者试图比主诚实网络更快地构建一个秘密的欺诈性交易链。这本质上是一场竞赛,结果是概率性的,取决于攻击者在网络计算能力中所占的份额。为了分析一个区块链协议的安全性,我们可以运行这场竞赛的蒙特卡洛模拟。PRNG决定了谁在每一步找到下一个区块。模拟的输出——攻击者的成功概率——为我们对系统的信任提供了信息。但是,如果用于 模拟本身 的PRNG有缺陷,我们的分析就毫无价值。一个差的生成器可能会系统性地低估攻击者的机会,让我们陷入虚假的安全感。我们信任我们数字世界安全的能力,部分取决于我们用来建模它的随机数的完整性。
我们的旅程从 的抽象之美,到原子的混沌之舞,基因的随机漂变,市场的剧烈波动,以及算法与其对手之间微妙的智慧之战。在每一个领域,不起眼的伪随机数生成器都作为不可或缺的工具出现。它是模拟的命脉,估算的引擎,以及算法世界中的盾牌。
因此,追求更好的随机数生成器远不止是一个小众的学术活动。它是一场追求更完美、更可靠、更通用的骰子的探索,以便在我们探索世界的过程中使用。我们需要公平的骰子,其每个面出现的频率都正确。我们需要没有记忆的骰子,一次投掷不影响下一次。我们需要可以分发给成千上万合作者的骰子,每个人都得到自己独立的一套。有时,我们还需要下一次投掷结果是任何对手都无法猜到的秘密的骰子。其美妙之处在于一个惊人的事实:一个生成数字序列的简单、确定性规则,可以被精心打造以满足这些深刻而多样的需求,成为一把通用的钥匙,解锁对我们宇宙几乎每个角落的更深理解。