随机数是由不可预测的过程所产生的数值——来源于某种物理现象(如骰子或热噪声),或来自模仿随机性的计算机算法。真正随机数生成器(TRNG)与伪随机数生成器(PRNG)之间的重大差异,决定了你的应用到底是真正安全,还是只是看起来随机。无论你是需要为抽奖活动快速选号,还是生成加密安全的密钥,使用一款可靠的随机数生成器都至关重要。本指南涵盖了基础知识、搞错随机性的真实代价,以及如何在 2026 年根据自己的场景挑选合适的生成器。
随机数到底是什么?(又为什么重要?)
随机数并非由它的具体数值来定义,而是由来源的不可预测性来定义。当你掷骰子时,结果是随机的,因为物理过程——骰子翻滚、撞击表面、空气阻力——过于复杂,无法精确建模。在计算机领域,随机性以熵(entropy)来度量,这是信息论中量化不可预测性的术语。来源的熵越高,就越难猜出下一个数字。
日常生活中对随机的理解往往与计算机领域有所不同。像「1 2 3 4 5」这样的序列在人类看来并不随机,但正如维基百科随机数条目所指出的:「我们无法权威地断言第一个序列不是随机的……它可能就是偶然产生的。」关键特性在于:序列中的每个数字都独立于其他数字,无法根据先前输出进行预测。
生成器大致可分为两大类:
– 真正随机数生成器(TRNG)——也称为硬件随机数生成器(HRNG)——从本质上不可预测的物理现象中提取数字。
– 伪随机数生成器(PRNG)——使用确定性的数学算法。它们看起来随机,但只要你知道初始状态(种子),就能完全复现。
厘清这一区别是保障应用安全的第一步。如果你想更全面地了解各类随机化工具——包括那些不限于数字的工具——请查看我们详尽的数字随机生成器指南。

核心难题:为什么计算机无法「真正」随机
计算机是一台确定性的机器。每条指令都遵循固定顺序执行。要生成随机数,它必须依赖外部的熵源,或依赖某种模拟随机性的算法。正如数学家 John von Neumann 在 1951 年那句名言:「任何考虑用算术方法产生随机数字的人,当然都处于一种罪恶的状态。」
这句被保留在维基百科随机数生成条目中的话,揭示了一个根本事实:算术(算法)方法永远无法产生真正不可预测的数字。它们只能产生在统计检验面前_看起来_随机的序列。获得真正不可预测性的唯一方式,是从物理世界中收集熵——电阻中的热噪声、大气噪声、放射性衰变,甚至熔岩灯中混乱的图案。
真正随机数生成器(TRNG)与伪随机数生成器(PRNG):关键区别
核心差异归根到底在于不可预测性的来源:
| 特性 | TRNG(真正 RNG) | PRNG(伪随机 RNG) |
|---|---|---|
| 来源 | 物理熵(热噪声、量子效应等) | 数学算法 |
| 是否确定性? | 否——每个输出都依赖于物理过程 | 是——相同种子始终产生相同序列 |
| 是否可复现? | 否 | 是(在种子已知时) |
| 速度 | 通常较慢,受限于熵收集速率 | 非常快 |
| 是否会阻塞? | 熵池耗尽时可能阻塞 | 非阻塞 |
| 使用场景 | 加密、安全密钥、彩票 | 仿真、游戏、非安全应用 |
TRNG 直接测量某种物理现象。常见来源包括电阻中的热噪声、电子电路中的抖动(jitter)、半导体中的散粒噪声,以及光电效应等量子现象。一个实用的 TRNG 通常包括噪声源、数字化器、用于提升质量的调节器(随机性提取器),以及用于确保来源仍在正常工作的健康检测。
PRNG 从一个称为随机种子(random seed,通常从 TRNG 获取)的初始值出发,然后反复应用数学变换以生成下一个数字。该序列是确定性的,意味着只要知道种子,你就能回放出完全相同的数字。这种可复现性对调试仿真非常有利,但如果攻击者能够发现或猜到种子,则对安全而言是灾难性的。
第三类——密码学安全的伪随机数生成器(CSPRNG)——融合了两者的优点:它先用 TRNG 获取高熵种子,再用精心设计的算法产生源源不断的、在计算上与真正随机无法区分的数字流。标准密码学设计采用的就是这种混合方式,详见维基百科条目。
TRNG 如何创造真正的不可预测性
真正的 RNG 从物理环境中捕捉随机性。最著名的例子之一来自 Cloudflare:他们旧金山办公室里的一面熔岩灯墙。正如一篇 Cloudflare 博客文章(2017) 所解释的,熔岩灯中不断变化、不可预测的图案被拍照并哈希,从而产生高熵的随机数。虽然熔岩灯是一种新颖的做法,但大多数 TRNG 使用更紧凑的来源,例如反向偏置二极管的热噪声。
另一个近期的爱好者项目——由 Joshua Coleman 制作的 Neon Entropy Random Number Generator(2026 年 5 月)——使用了三只老式霓虹灯。通电霓虹灯的放电速率会不可预测地变化,光学传感器捕捉这种变化。Raspberry Pi Pico W 读取模拟信号,并产生可用作随机种子的 SHA-256 64 位值。作者承认该系统「特性尚不明确」,需要进一步验证,但它很好地展示了从物理过程中提取熵的原理。
为什么 PRNG 是计算领域的主力
PRNG 无处不在,因为它们速度快、可复现、易于实现。维基百科条目指出,它们「在仿真(例如蒙特卡洛方法)、电子游戏(例如程序化生成)和密码学等应用中处于核心地位。」在仿真中,从相同种子出发能再次跑出相同的随机序列,对调试至关重要。在密码学中,只要_种子被保密_,PRNG 也可以是安全的。
使用最广泛的通用 PRNG 是 Mersenne Twister(MT19937),以其出色的统计特性和超长周期(2^19937 − 1)闻名。许多编程语言(Python、Ruby、PHP)将 Mersenne Twister 作为非密码学用途的默认随机数生成器。但 Mersenne Twister 并非密码学安全的——攻击者在观察到约 624 个连续输出后就能重建其内部状态。对于任何与安全相关的内容,你需要的是 CSPRNG。如果你使用特定语言开发,Python 随机数生成器、Java 随机数生成器和 C++ 随机数生成器等工具会为你讲解每种平台的正确做法。
现实世界的后果:当随机数失效(彩票操纵案)
一个孱弱的随机数生成器造成的后果可能是灾难性的。最具戏剧性的例子是维基百科条目中描述的美国彩票操纵案。Multi-State Lottery Association(MUSL)的信息安全主管在例行维护期间,秘密地在安全的 RNG 计算机上安装了后门恶意软件。在数年间,他通过预测彩票号码累计赢得了 1650 万美元。这次攻击之所以奏效,是因为后门使得 RNG 实际上变得可预测——这是依赖被污染或孱弱生成器的典型失败。
即便没有恶意的后门,有缺陷的随机性也会造成广泛损害。维基百科随机数条目引用了 2012 年的一起事件:某在线加密方法存在 99.8%(并非完全 100%)的随机性缺陷,对某大型服务的约 27,000 名客户造成了负面影响。这类缺陷表明,即便与真正随机性的微小偏差,也会带来巨大后果。
另一个备受关注的案例是 Dual EC DRBG 后门。这款经 NIST 认证的密码学安全伪随机数生成器被怀疑植入了 NSA 的后门,使 NSA(如果该理论正确的话)能够确定其内部状态,并破解依赖它的加密。正如维基百科条目所指出的,尽管 Dual EC DRBG「早在 NSA 后门于 2013 年被证实之前,就已是一个极差且可能被植入后门的伪随机数生成器」,但它在实践中仍获得了相当可观的使用,包括被安全公司 RSA Security 采用。
轻松一点说,在线随机数工具的流行程度显示出人们对它们的依赖有多深。根据 Wheel of Names 的数据,截至 2026 年,该网站已记录了 462,479,318 次转盘旋转,以及超过 128 万小时的旋转时长。该网站使用密码学安全的函数(crypto.getRandomValues())来确保为用户提供真正的不可预测性,其中许多用户在进行抽奖、课堂点名和直播赠礼。这种规模的使用量表明,当随机数生成器出现问题时,受影响的是数百万人。

如何在 2026 年为你的用例选择合适的随机数生成器
选择合适的随机数生成器,取决于应用在安全、速度和可复现性方面的需求。请使用以下决策框架:
用于密码学:必须使用 CSPRNG
如果你的应用涉及加密密钥、身份验证令牌、会话 ID 或任何其他安全敏感数据,你必须使用密码学安全的伪随机数生成器(CSPRNG)。绝不要在这些场景下使用 Math.random()、random.randint() 或 Mersenne Twister。可预测性带来的后果——金融盗窃、数据泄露、账户接管——太过严重。
推荐工具:
– Web 浏览器:使用 Web Crypto API(crypto.getRandomValues())。这正是 Wheel of Names 用来保证随机性的方法。
– Unix/Linux 系统:从 /dev/urandom 读取。它提供一个由硬件熵播种的非阻塞 CSPRNG。(注意:/dev/random 会阻塞,直到有足够熵可用,不推荐用于大批量读取。)
– Windows:使用 CryptGenRandom() 或 RNGCryptoServiceProvider。
– Intel 处理器:RDRAND 指令从片上硬件生成器返回随机数,但许多注重安全的系统会将其输出与其他熵源混合,以抵御潜在的后门。

用于仿真和游戏:PRNG 的速度(如 Mersenne Twister)
对于蒙特卡洛仿真、科学计算、视频游戏和程序化内容生成,速度和统计质量比密码学安全性更重要。在这里,像 Mersenne Twister(MT19937) 或更新的 PCG 家族这样的快速 PRNG 非常合适。这些生成器每秒可产生数十亿个数字,并通过大多数统计检验。
- 可复现性是关键优势:从相同种子出发会得到相同序列,这对调试和确保实验可复现至关重要。
- 注意:不要将这些用于任何涉及金钱、身份或访问控制的场景。
用于彩票与公平性:基于硬件熵的必要性
彩票、抽奖、奖品开奖,以及任何在法律或伦理上要求公平的系统,必须使用基于硬件的熵(TRNG),或至少使用由物理熵播种、设计良好的 CSPRNG。彩票操纵案表明,即便是「安全」的 RNG,一旦种子或软件被篡改也会被攻破。来自大气噪声(如 Random.org)、量子随机数生成器或专用硬件模块的物理随机性,提供了最强的不可预测性保证。
对于像生成测试用随机电话号码这样的日常任务,随机电话号码生成器无需密码学硬件的复杂性,即可提供快速、可靠的结果。
对于高风险应用:
– 物理来源:使用专用的 HRNG(例如基于热噪声或量子光子发射的)。
– 混合方式:将硬件熵与 CSPRNG 结合以获得速度。
– 审计:定期对输出进行均匀性和独立性测试(见第 6 节)。
随机性的前沿:最新研究与工具(2026 年更新)
虽然 TRNG/PRNG 的基本差异已广为人知,但近期研究在速度、效率和适应性方面不断突破边界。一项值得关注的 2026 年研究发表于《Scientific Reports》,提出了 DMARS_WGO(Dual-Mode Adaptive Reinforced Switching Walrus-Gazelle Optimizer)——一种使用强化学习来动态平衡探索与利用的混合元启发式算法。
根据论文 DMARS_WGO: a deep reinforcement-driven hybrid metaheuristic for intelligent adaptive optimization,该算法在 CEC2017 测试集上 29 个基准函数中的 26 个取得了第一名,在 CEC2022 上 12 个函数中的 8 个取得了第一名。虽然 DMARS_WGO 主要是一个优化算法(并非通用 RNG),但它展示了机器学习如何能提升随机搜索过程的质量——这是仿真中更优质随机性所带来的直接收益。
对日常开发者而言,2026 年最重要的最佳实践是依赖操作系统级的 CSPRNG。Intel 的 RDRAND 指令内置于现代 CPU,可直接由代码访问基于硬件的随机数生成器。Linux 内核的 /dev/urandom 现在使用基于 ChaCha20 的 CSPRNG,既快又安全。Web Crypto API(crypto.getRandomValues())已成为客户端 JavaScript 安全的标准。
现代 CPU 如何生成随机数(RDRAND 及以后)
来自 Intel 和 AMD 的现代处理器包含一个内置的硬件随机数生成器(HRNG),可通过 RDRAND 指令访问。该生成器使用片上熵源——例如金属-氧化物-半导体(MOS)晶体管中的热噪声——来产生随机位。它每秒可提供数千个随机数。
然而,由于硬件在理论上有被篡改的可能(如 Dual EC DRBG 案所示),许多对安全敏感的应用并不单独使用 RDRAND。维基百科条目指出:「对于 Linux 中的随机数生成,如果不将 Intel RDRAND 硬件 RNG 的输出与其他熵源混合使用,被视为不可接受。」这种被称为「whitening(白化)」的做法,将多个独立来源结合起来,以降低隐藏后门带来的风险。
如何检验你数字的「随机性」
即便使用了设计良好的 RNG,你也应当验证其输出是否表现出预期的统计特性。两项主要检验是等概率性(每个值大致等频率出现)和独立性(连续值之间没有可预测的模式)。
根据 PsychicScience.org 的随机数生成器页面,你可以通过在选定范围内生成 100,000 个开放序列整数来测试浏览器的 Math.random() 方法。该页面指出:「由于偶然因素,随机性检测大约每 10 次会显示一次非随机序列」——10% 的误报率是正常的。
简单讲解卡方检验
最常见的随机性统计检验是卡方(χ²)拟合优度检验。它在实践中是这样运作的:
- 生成一个序列:从你的 RNG 产生 N 个数字(例如 1 到 6 之间的 1,000 个整数)。
- 计数:每个值出现了多少次。
- 比较:将这些观测计数与期望计数进行比较(对于均匀分布,每个值应当出现 N/6 次)。
- 计算卡方统计量:对所有类别求和 ((观测 − 期望)² / 期望)。
- 解释:如果与该卡方值相关的概率大于 0.10(典型阈值),则没有证据表明存在显著的随机性偏离。
第二项针对成对独立性的检验,检查连续数字每一可能组合的频率是否同样可能。例如,掷骰子时,数对 (1,1)、(1,2)、……、(6,6) 都应以相近频率出现。卡方列联表检验能够检测出诸如在高值与低值之间来回交替之类的偏差。
许多在线工具(包括 PsychicScience.org 上的工具)提供内置的卡方检验。对于严谨的验证,NIST Statistical Test Suite(STS) 提供了 15 种不同的检验,包括频率检验、游程检验和块频率检验。
结论
理解 TRNG 与 PRNG 之间的差异,是保障应用安全、做出明智决策的第一步。TRNG 收集物理熵;PRNG 使用确定性算法和种子;CSPRNG 为安全而融合两者。选错生成器的现实后果可能是经济损失、法律责任和声誉损害,正如 1650 万美元的彩票操纵案所示。
可操作建议:从今天起审计你的代码库,确保 Math.random() 从未用于任何安全、身份验证或令牌生成场景。将所有敏感操作迁移到 CSPRNG。对于仿真和游戏,像 Mersenne Twister 这样的快速 PRNG 就够用了,但务必始终留意可复现性这一要求。如果你在运营彩票、抽奖或任何公平性至关重要的系统,请投资于专用硬件 RNG 或经过充分验证、熵来源可审计的 CSPRNG。用 2026 年 DMARS_WGO 研究的话来说,「智能地自适应其搜索动态」的能力是前沿所在——但对大多数开发者而言,仅仅是选择合适的现有工具,就是最具影响力的一步。
常见问题
真正随机数生成器(TRNG)和伪随机数生成器(PRNG)有什么区别?
TRNG 使用物理过程(热噪声、量子效应、熔岩灯)产生本质上不可预测的数字。PRNG 使用数学算法和起始种子;其输出看起来随机,但完全确定。对于安全场景,需要 TRNG 或 CSPRNG。
网站生成的随机数是真正随机的吗?
大多数网站使用 PRNG,它们是确定性但在统计上随机的。提供密码学或彩票服务的可信网站会使用基于硬件的熵或 CSPRNG(例如 Web Crypto API)。对于像名字抽取器这类非安全应用,简单的 PRNG 通常就足够了。
如何生成密码学安全的随机数?
在浏览器中使用专用 API,如 Web Crypto API(crypto.getRandomValues())。在 Unix/Linux 系统上,从 /dev/urandom 读取。绝不要将 Math.random() 用于安全目的。对于大批量生成,像 ChaCha20 这样的现代 CSPRNG 既快又安全。
发表回复