
随机数生成器:计算机如何创造随机性(2026)
📷 Skitterphoto / Pexels随机数生成器:计算机如何创造随机性(2026)
探索随机数生成器的工作原理、伪随机数与真随机数的区别、密码学随机性,以及在游戏、安全和统计中的实际用例。
随机性究竟是什么?
我们随意使用"随机"这个词。歌曲随机播放。骰子掷出六点。彩票球落入管道。在日常生活中,随机意味着不可预测——我们无法提前知道的事情。但这种直觉隐藏着一个令人惊讶的深刻问题:运行精确确定性逻辑的计算机,真的能产生真正不可预测的东西吗?
诚实的答案是:不容易,默认情况下不行。计算机是确定性机器。给定相同的输入和相同的状态,它们每次产生相同的输出。这是一个特性——它使软件可靠且易于调试。但这也是产生真正随机性的根本障碍。
计算机解决(或绕过)这个问题的方式是实用计算中更优雅的成就之一。它涉及数学、物理和密码学,影响从您玩的游戏到银行账户安全的现代软件的每个角落。
伪随机数生成器:计算的主力
产生看似随机数字的最常见方法是伪随机数生成器(PRNG)。尽管前缀略显不雅,PRNG确实有用,驱动了软件中绝大多数依赖随机性的操作。
PRNG从称为种子的初始值开始,通过数学公式运行产生一系列数字。公式被设计使结果序列看起来统计随机:数字均匀分布在一个范围内,难以检测模式,任何值出现的概率大致相等。
PRNG的定义特征是序列完全由种子决定。如果您用相同的种子运行相同的算法,您会得到完全相同的数字序列。这既是其优势也是其局限。
梅森旋转算法
世界上最广泛使用的PRNG可能是1997年引入的梅森旋转算法(Mersenne Twister)。它出现在Python的random模块、Ruby、PHP和许多其他语言和环境中。它产生2^19937 - 1的周期,意味着它会在序列重复之前生成超过10^6000个数字。
梅森旋转算法通过了几乎所有的随机性统计测试。对于物理模拟、蒙特卡洛计算、生成游戏关卡和洗牌播放列表,它非常出色。但它有一个严重缺陷:给定足够的输出值,可以重建生成器的内部状态。观察了足够数量输出的攻击者可以预测所有未来的输出。
这使得梅森旋转算法和类似的PRNG从根本上不适合密码学应用。
为什么种子很重要
初始种子对PRNG来说是一切。如果攻击者知道种子,他们就知道整个序列。软件通常用当前时间戳为PRNG播种,这听起来合理,但时间戳的熵(不可预测性的位数)有限。
真随机数生成器:利用物理不可预测性
如果您想要不由任何先前状态决定的数字,您需要从物理世界获取熵。
**真随机数生成器(TRNG)**正是这样做的。它们测量在量子或热力学层面真正不可预测的物理过程:放射性衰变的精确时序、电子电路中的热噪声、光束分裂器中的光子检测事件,或无线电接收器捕获的大气噪音。
random.org等网站收集大气无线电噪音来产生真随机数。称为HSM(硬件安全模块)的专用硬件模块包含用于高保证安全应用的专用熵源。
权衡是吞吐量。物理过程是慢的。在实践中,大多数系统使用混合方法:使用真随机性为高质量的CSPRNG播种,然后快速生成数字同时保持不可预测性。
密码学随机性:黄金标准
密码学需要特定的东西:一个输出在计算上与真正随机性无法区分的生成器,即使对观察了大量输出的对手也是如此。
这是**密码学安全伪随机数生成器(CSPRNG)**的领域。CSPRNG是具有额外数学保证的PRNG:
- 前向保密。如果内部状态以某种方式被揭示,过去的输出无法被重建。
- 不可预测性。给定任何数量的过去输出,未来输出无法比暴力猜测更快被预测。
- 良好播种。CSPRNG使用来自真实物理源的熵播种,而不仅仅是时间戳。
现代操作系统将CSPRNG作为核心服务提供。在Linux上,这是/dev/urandom和/dev/random。在macOS和iOS上,是SecRandomCopyBytes。在Windows上,是CryptGenRandom和较新的BCryptGenRandom。这些系统原语从许多来源收集熵:硬件中断、磁盘寻道时间、网络数据包时序、击键间隔,以及现代CPU内置的专用硬件熵生成器。
Web Crypto API
对于Web应用程序和基于浏览器的工具,W3C Web Crypto API通过crypto.getRandomValues()函数提供对浏览器CSPRNG的访问。
// 生成16个密码学安全的随机字节
const array = new Uint8Array(16);
crypto.getRandomValues(array);
console.log(array);
crypto.getRandomValues()返回的值来自操作系统的CSPRNG,而操作系统又从硬件熵源获取。它们适合生成加密密钥、会话令牌、随机数和任何其他安全敏感的值。
这是ToolPal用于其随机数生成工具的方法。当您在网站上生成数字时,值来自crypto.getRandomValues()——与安全软件使用的相同来源。它们不是用时间戳播种的,而是真正不可预测的。
随机数的实际用例
游戏和模拟
视频游戏中的每次骰子投掷、每次战利品掉落、每次洗牌和每个程序化生成的关卡都依赖于随机数。游戏广泛使用PRNG,因为速度和统计属性比密码学安全性更重要。
模拟软件——从天气建模到金融风险分析——使用蒙特卡洛方法的随机数,使用数千或数百万个随机样本来估算分析上太复杂的系统的结果。
一个微妙但重要的点:使用种子PRNG的游戏可以重现确切的游戏过程,如果您知道种子的话。这就是Minecraft等游戏中"speedrun种子"的工作原理——种子决定了世界的每个元素。
统计和采样
研究人员需要来自总体的代表性随机样本。调查设计、药物试验随机化、质量控制采样和A/B测试分配都依赖于良好的随机数生成。
统计采样还包括自举法——一种从现有数据随机重采样用于估计置信区间的技术。
密码学和安全
这是随机性变得至关重要的地方。现代密码学的每个方面都依赖不可预测的随机数:
- 加密密钥:AES-256密钥是256个随机位。如果这些位可预测,加密就被破解了。
- 会话令牌:Web应用生成验证用户的会话ID。可预测的会话ID可以被伪造,允许账户接管。
- 随机数(Nonces):许多密码协议使用一次性值来防止重放攻击。这些必须是随机的。
- 密码盐值:密码哈希添加随机盐值以防止彩虹表等预计算攻击。
- TLS握手:保护HTTPS连接的整个TLS协议依赖于连接设置期间生成的随机值。
历史上几个灾难性的安全失败是由于随机数生成不佳造成的。2008年的Debian OpenSSL漏洞意外削弱了熵源,将有效密钥空间减少到几千个值。
关于随机性的常见误解
"近期历史影响未来结果。" 这是赌徒谬误。如果硬币连续十次正面朝上,大多数人直觉上感到反面"应该来了"。并非如此。每次翻转都是独立的。
"人类擅长挑选随机数。" 我们并不擅长。当被要求写下一串"随机"数字时,人们会避免重复数字,避免同一数字的长串,并无意识地偏好某些值。
"看起来随机的输出意味着生成器是好的。" 视觉检查是评估随机性的糟糕方式。专业评估使用NIST SP 800-22、Diehard测试或TestU01等正式测试套件。
"随机性意味着均匀分布。" 随机性是关于不可预测性,而不是分布。您可以从正态分布、指数分布或任何其他形状中获取随机样本。"随机"意味着您无法预测下一个值,而不是所有值同样可能。
如何选择正确的随机性类型
| 用例 | 推荐来源 |
|---|---|
| 游戏机制、洗牌、模拟 | PRNG(梅森旋转算法或类似) |
| 统计采样、A/B测试 | 良好播种的PRNG |
| 密码生成 | CSPRNG(Web Crypto API或等效) |
| 加密密钥、会话令牌 | CSPRNG |
| 彩票或高风险抽签 | TRNG或经审计的CSPRNG |
| 可重现的测试 | 带文档化种子的固定种子PRNG |
结论
随机数生成位于理论和工程的有趣交叉点。随机性的数学属性——它意味着什么、如何衡量、如何生成——是真正深刻的。实际结果——加密连接、公平游戏、代表性样本、安全密码——是有形且即时的。
关键要点:
- PRNG是确定性的且快速,适合模拟和游戏,但不适合安全。
- 真实RNG从物理过程获取熵,产生真正不可预测的值,但速度慢。
- CSPRNG结合两者:使用物理熵为具有密码学保证的算法播种,同时提供速度和安全性。
- Web Crypto API为基于浏览器的应用带来CSPRNG质量的随机性,无需服务器参与即可生成安全密码、令牌和数字。
下次您在ToolPal的密码生成器上生成密码或从我们的随机数生成器中选择随机数时,您可以确信这些值来自crypto.getRandomValues()——保护现代Web的相同密码学基础。没有时间戳,没有可预测的种子,没有赌徒谬误。只是真正的、不可预测的随机性,被正确处理。