Skip to main content
CheckTown
生成工具

随机数生成器:在线生成真正无偏的随机数

发布于 阅读约 5 分钟
本文目录

什么是随机数生成?

随机数生成是指产生无法被提前预测的数字的过程。计算机是确定性的机器——没有外部输入就无法产生真正的随机性。不同的技术会产生不同质量的随机性,而这对于安全类应用而言至关重要。

真随机数生成器(TRNG)从物理现象中采集熵:鼠标移动、按键时间、网络数据包到达时间,或专用硬件传感器。伪随机数生成器(PRNG)则使用数学算法,以熵作为种子,生成看似随机的序列。

随机数是如何生成的

CheckTown 使用浏览器的密码学安全随机数生成器。

  • 熵源——使用 window.crypto.getRandomValues(),其随机性来自操作系统级别的熵
  • 范围映射——将原始随机值无偏差地映射到你指定的最小值/最大值范围内
  • 批量生成——一次生成多个数字,满足列表、数组或批量需求

免费试用 —— 无需注册

生成随机数 →

何时使用随机数生成器

随机数生成在开发、测试和统计等领域有着广泛的应用。

  • 测试——生成随机测试数据以填充测试夹具(fixture)或初始化测试数据库
  • 抽样——从数据集中随机抽取样本,用于统计分析或 A/B 测试分组
  • 游戏与模拟——为模拟、游戏或抽奖生成不可预测的输入

常见问题

Math.random() 和 crypto.getRandomValues() 有什么区别?

Math.random() 使用的是在启动时播种的快速伪随机数生成器(PRNG)。它适用于模拟和游戏,但不适合安全用途。crypto.getRandomValues() 使用操作系统的密码学安全伪随机数生成器(CSPRNG),适合用于生成令牌、密钥及其他安全敏感的数值。在安全场景下请始终使用 crypto.getRandomValues()。

我可以用随机数来生成加密密钥吗?

可以,但前提是必须用 CSPRNG 生成。来自 Math.random() 或类似的非密码学 PRNG 的随机数,在已知种子并获得足够多输出样本的情况下是可预测的。加密密钥、令牌、盐值和随机数(nonce)都必须使用密码学安全的随机性来生成。

什么是取模偏差,它如何影响随机数范围?

取模偏差发生在使用 % 运算符将随机值映射到某个范围时。如果随机值空间无法被范围大小整除,某些值出现的频率就会高于其他值。例如,使用 % 10 将 0-255 映射到 0-9 时,会导致 0-5 出现得略微频繁一些。CheckTown 采用拒绝采样法来消除这种偏差。

相关工具