真随机与伪随机:随机数生成器如何工作
当你点击网站上的“生成”按钮时,你期望结果是完全随机的。但在计算机科学的世界里,真随机出奇地难以实现。大多数数字随机性实际上是“伪随机”。在本指南中,我们将解释真随机数生成器(TRNG)与伪随机数生成器(PRNG)的区别,以及为什么这一区别对网络安全至关重要。
亲自试一试
想看看伪随机算法的实际效果?使用我们免费的随机数生成器,即时生成自定义序列。
目录
什么是随机性?
在数学中,如果一个数字序列不包含任何可识别的模式或顺序,就被认为是随机的。真随机意味着:即使知道序列中之前的数字,对预测下一个数字也毫无帮助。
虽然人类出了名地不擅长生成随机数(我们会回避重复数字、偏爱某些模式),但计算机本质上是确定性机器,它们严格按程序执行指令。那么,一台只懂“1”和“0”的机器如何产生随机性?
伪随机数生成器(PRNG)
绝大多数网页工具、电子游戏和软件应用都使用 PRNG。PRNG 是一种数学算法,它取一个初始值(称为“种子”),通过复杂方程运算,产生一个看起来随机的数字序列。
因为 PRNG 依赖数学,所以它是确定性的。如果今天、明天和十年后给 PRNG 完全相同的种子,它每次都会输出完全相同的数字序列。
这非常高效。PRNG 速度极快,每秒可以生成数百万个数字。对于打乱 Spotify 播放列表、在游戏中掷数字骰子或运行统计模拟这类事情,PRNG 完全够用。JavaScript 中标准的 Math.random() 函数就是一个 PRNG。你可以用我们的1-10随机数生成器实际测试。
正在生成密码?
安全需要真正不可预测的随机性。绝不要用标准 PRNG 生成密码。请改用我们安全的随机密码生成器。
真随机数生成器(TRNG)
真随机数生成器不依赖数学。它们从现实世界中不可预测的物理现象中提取随机性。
现代 TRNG 测量电子电路中的热噪声、光电效应,甚至用户按键的时间间隔。最著名的 TRNG 服务 Random.org 使用大气噪声(无线电静电)来生成数字。
由于这些物理事件受量子力学支配,它们在根本上不可预测。TRNG 不使用种子,其数字序列无论如何都无法复现。
为什么这一区别对安全至关重要
如果你只是抽取抽奖中奖者,或使用我们的随机分组生成器给玩家分组,PRNG 完全安全。“伪”随机性无关紧要。
然而,在密码学中,可预测性就等于脆弱性。如果黑客能推算出你的 PRNG 所使用的数学种子,他们就能复现你的计算机生成的每一个“随机”数——包括你的私人加密密钥和密码。
正因如此,浏览器开发了密码学安全的伪随机数生成器(CSPRNG),例如 window.crypto.getRandomValues()。这些算法仍然使用数学,但它们从高度不可预测的系统变量(如鼠标移动或 CPU 温度)中采集“种子”,并在数学上保证能通过严格的统计随机性测试。这正是驱动我们随机密码生成器等安全工具的后端技术。
如果你需要为活动生成保证不重复的唯一数字,PRNG 非常适合。你可以用我们的不重复随机数生成器工具试一试。
常见问题(FAQ)
JavaScript 中的 Math.random() 函数是真随机的吗?
不是。Math.random() 是伪随机数生成器(PRNG)。它使用数学算法和一个初始种子值产生看似随机的数字序列,但实际上完全确定、可预测。
PRNG 和 TRNG 有什么区别?
PRNG(伪随机数生成器)用数学产生看似随机但确定性的数字。TRNG(真随机数生成器)从大气噪声或放射性衰变等不可预测的物理现象中提取随机性,因此真正不可预测。
可以用伪随机数生成器生成密码吗?
不可以。绝不要用标准 PRNG 生成密码或加密密钥。由于 PRNG 是确定性的,能猜到种子的黑客就能复现你的确切密码。请务必使用密码学安全的伪随机数生成器(CSPRNG)或 TRNG。