本文目录
什么是随机数生成?
随机数生成是指产生无法被提前预测的数字的过程。计算机是确定性的机器——没有外部输入就无法产生真正的随机性。不同的技术会产生不同质量的随机性,而这对于安全类应用而言至关重要。
真随机数生成器(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 采用拒绝采样法来消除这种偏差。