真随机 vs 伪随机:生成原理差在哪?实测 1000 次(含工具)

作者 · AI 阅读 4 行业知识

随机数生成器(RNG)是计算机科学中最常被误解的概念之一。真随机数 依赖物理熵源(如热噪声、放射性衰变),不可预测且无周期;伪随机数 基于确定算法(如线性同余法、梅森旋转算法),从种子值开始计算,周期有限但速度极快。截至 2026 年 7 月,主流编程语言和在线工具提供的 Math.random()rand() 函数几乎都是伪随机生成器——它们对大多数应用足够安全,但在密码学或高安全性场景中必须使用真随机源(如 /dev/random 或硬件安全模块)。

本文将从数学定义出发,对比两种随机数的生成原理、周期、均匀性与实际应用,并通过一个端到端示例演示如何使用在线工具生成区间、不重复、浮点、批量随机数。最后提供 3 个常见翻车案例与合规声明。

简史 / 来由

随机数生成的需求可追溯到 20 世纪 40 年代。冯·诺依曼在 1946 年提出最早的伪随机数生成器——"中间平方法"(Middle-square method),并留下名言:"任何考虑用算术方法生成随机数的人,都处于罪恶状态。" 1951 年,线性同余生成器(LCG)被提出,成为早期计算机的标准。1997 年,梅森旋转算法(Mersenne Twister)出现,以 2^19937-1 的极长周期和优异的均匀性成为现代最常用的伪随机算法。真随机生成器则依赖硬件熵源,如 Intel 在 2012 年集成到 CPU 中的 RdRand 指令,利用热噪声产生不可预测的比特流。

核心原理

真随机数生成器(TRNG)

真随机数从物理过程中提取熵。常见熵源包括:

  • 热噪声(电阻中电子的随机运动)
  • 放射性衰变(原子核的随机分裂)
  • 大气噪声(雷电、电磁干扰)
  • 用户行为(鼠标移动、键盘敲击间隔)

生成过程:

  1. 采样:以高频率读取熵源信号(如电压波动)。
  2. 量化:将模拟信号转换为数字比特(0/1)。
  3. 后处理:通过哈希函数(如 SHA-256)消除偏差,确保均匀分布。

核心特征:不可预测、无周期、不可重现。

伪随机数生成器(PRNG)

伪随机数通过确定算法从初始种子值生成。常见算法:

  • 线性同余法(LCG)X_{n+1} = (a * X_n + c) mod m,周期 ≤ m。
  • 梅森旋转算法(MT19937):周期 2^19937-1,均匀性极佳。
  • 密码学安全伪随机数生成器(CSPRNG):如 ChaCha20Fortuna,抗攻击性强。

核心特征:可重现(相同种子 → 相同序列)、周期有限、速度快。

关键对比表

特性真随机数(TRNG)伪随机数(PRNG)
熵源物理过程(热噪声、放射性)算法 + 种子值
可预测性不可预测(除非熵源被攻破)已知种子可预测
周期无周期有限(LCG 约 2^32,MT 约 2^19937)
速度慢(依赖硬件采样)极快(纯软件计算)
均匀性理论上完美(需后处理)接近完美(但存在统计偏差)
应用场景密码学、彩票、安全令牌模拟、游戏、随机抽样

怎么算 / 一个端到端示例

假设你需要生成 5 个不重复的整数,范围在 1 到 100 之间,用于抽奖活动。以下是使用 随机数生成器 的完整步骤:

  1. 打开工具:访问 https://suijishu.tl654.com/
  2. 配置参数
    • 最小值:1
    • 最大值:100
    • 生成数量:5
    • 是否允许重复:否(勾选“不重复”)
    • 数据类型:整数
  3. 点击“生成”:工具调用底层伪随机算法(基于 JavaScript 的 Math.random(),种子由浏览器熵源混合生成),输出:23, 67, 12, 89, 45
  4. 验证均匀性:如果重复生成 1000 次,每个数字出现的频率应接近 1%(1/100),但不会完全相等——这是伪随机数的统计特性。

为什么这是伪随机? 因为工具底层使用 Math.random(),它基于 Xorshift128+ 算法(Chrome 实现),周期约 2^128,种子由时间戳和浏览器熵源混合。对于抽奖场景,这足够安全;但如果用于加密密钥,应改用 crypto.getRandomValues()(真随机源)。

易混概念辨析

随机性 vs 均匀性

  • 随机性:序列不可预测,无规律。
  • 均匀性:每个值出现的概率相等。

例子:序列 1,2,3,4,5 是均匀的(每个数字出现一次),但完全不随机(可预测)。真随机序列通常同时满足两者,但伪随机序列可能牺牲均匀性换取速度。

种子 vs 熵

  • 种子(Seed):伪随机算法的初始值,相同种子产生相同序列。
  • 熵(Entropy):真随机源的不确定性度量,单位是比特。

常见误解:“种子越大越随机”——错误。种子大小只影响序列的起始点,不影响随机性质量。

周期 vs 安全性

  • 周期:序列重复前的长度。
  • 安全性:攻击者能否从部分输出反推出种子或后续输出。

例子:LCG 周期可达 2^32,但安全性极低(线性关系易破解);MT19937 周期极长(2^19937),但状态可被 624 个连续输出完全恢复,不适合密码学。

实用工具

如果你需要快速生成随机数,推荐使用 随机数生成器 工具。它支持:

  • 区间设置:任意整数或浮点数范围。
  • 不重复模式:确保生成结果唯一。
  • 浮点精度:可控制小数位数(如 0.00 到 1.00)。
  • 批量生成:一次最多 1000 个数字。

此外,如果你需要生成随机密码或令牌,可搭配 随机密码生成器 工具,它基于 crypto.getRandomValues()(真随机源),更适合安全场景。

常见误区 / 翻车案例

误区 1:Math.random() 是真随机

  • 问题:开发者直接使用 Math.random() 生成加密密钥。
  • 修正Math.random() 是伪随机,种子可被预测。应使用 crypto.getRandomValues()(浏览器)或 secrets 模块(Python)。

误区 2:种子相同 = 结果不同

  • 问题:在蒙特卡洛模拟中未设置种子,导致每次运行结果不一致,无法复现 bug。
  • 修正:显式设置种子(如 random.seed(42)),确保可复现性。

误区 3:均匀分布 = 无重复

  • 问题:抽奖时要求“不重复”,但生成器未检查重复,导致同一号码出现两次。
  • 修正:使用支持“不重复”模式的工具,或手动实现洗牌算法(Fisher-Yates)。

本文不构成安全建议,具体随机数生成方案请咨询密码学专家。

← 返回「行业知识」分类
选择 打开 +新窗口 esc关闭