返回博客
动态 · random

Math.random() 是个 PRNG。你那颗 d100 是有偏的。

ECMA-262 §21.1.2.13 明确不要求 Math.random 是 CSPRNG,而且 2^32 mod 100 = 96,所以 Math.floor(Math.random() * 100) + 1 这一行在每一掷里都会把 1-96 这几面偏向 96 / 2^32 一点点。本工具用 crypto.getRandomValues 配 Lemire 2019 拒绝采样,并且 Statistics 面板上有一个实时 Pearson χ² 直方图,把开关切回 Math.random、掷个几千次,p 值会肉眼可见地塌下去。

6 分钟阅读Vectobox Team