怎样做到绝对随机

都说随机,可 Math.random() 给定种子输出完全可复现——那只是「伪随机」。要拿真随机,必须向物理世界取熵。下面用真空量子涨落给你摇一注,再让你亲手对比真随机和伪随机到底差在哪。

量子真空涨落摇出一注号码的插画

先说结论:纯软件算法再精妙,给定了种子结果就完全确定,那只是「伪随机」。只有向量子真空涨落这样的物理熵源取数,才称得上「原理上不可预测」——它不是「我们算不出」,是「宇宙自己也没算好」。

下面三种玩法点了就出,先选熵源再摇号,每颗球逐个揭晓。

动手玩

选玩法,摇一注

三种玩法都是预设好的,点了就出。号码全由后端从你选的熵源取真随机字节,再用拒绝采样无偏映射到号码区间——不偷懒取模,每个号码等概率。下面有徽章如实显示这一注到底用了哪个源。

双色球

红球 6 个 01–33 不重复 + 蓝球 1 个 01–16

大乐透

前区 5 个 01–35 不重复 + 后区 2 个 01–12 不重复

固定位数

指定位数或区间,一键生成无偏随机数

选熵源

默认量子真空涨落。量子源失败会自动降级,徽章会诚实标注,绝不会谎称量子。

量子真空涨落 (ANU) 大气噪声 (random.org) 密码学安全 (本地兜底)

摇号

点下面按钮,号码会逐个揭晓——别急着一次性出,每颗球落定都有反馈。

还没摇号。点「摇一注」开始。
看数据

随机性体检:真随机 vs 伪随机

同一批样本量,并排画出「伪随机 Math.random()」和「真随机(你当前熵源)」的字节分布直方图。数据全部来自本页真实生成——下面点「再采一批」就重新抓一次字节。你要看的不只是直方图长得像不像,而是上面那颗球来自哪里——熵源决定一切。

PRNG 伪随机字节分布
样本:0 字节χ² = —
真随机 量子真空涨落字节分布
样本:0 字节χ² = —

注意:单看直方图,真随机和伪随机长得几乎一样——这正是 PRNG 设计的目标。它们的差别不在「分布像不像均匀」,而在「能不能预测」:伪随机给定种子完全可复现,真随机不行。把鼠标移到两边的卡方值上,你会看到两者量级相当——所以判断真伪不能只看直方图,要看熵从哪来。

量子真空涨落
科普

三种熵源,差在哪

绝对随机这件事,严格讲只有量子随机配得上——它不是「我们算不出」,是「宇宙自己也没算好」。

量子真空涨落(ANU QRNG)

澳大利亚国立大学用激光做零差探测,测量真空的量子涨落来产生随机数。按量子力学,单次测量结果在原理上不可预测——即便拥有全部信息也无法预知。这是目前最接近「绝对随机」的来源。

来源:quantumnumbers.anu.edu.au / qrng.anu.edu.au

大气噪声(random.org)

用大气中的电噪声作熵源。实践中不可预测,但本质是「确定性混沌」——原理上若有足够信息能算出大气所有状态,理论上可推。够用,但不配叫「绝对随机」。

来源:random.org

密码学安全(本地 SecureRandom 兜底)

后端用 SecureRandom(CSPRNG)兜底,浏览器端用 crypto.getRandomValues。密码学安全,但仍属伪随机,给定内部状态理论可复现。诚实标注:不是真随机。这也是为什么本页把它放在链尾,绝不冒充量子。

顺带一提:Cloudflare 熔岩灯

Cloudflare 用一整面墙的熔岩灯阵列拍照取熵,本质也是确定性混沌,画面慢变+光照扰动让结果在实践中不可预测。

来源:blog.cloudflare.com

严谨

为什么不能直接取模

「随机字节 % 33 不就有 1–33 的号了吗?」听起来没毛病,可它会让一些号码概率偏高。本页的每颗球都用拒绝采样把越界字节剔掉再取模,保证等概率——代码全开源、有单测。

取模偏差示意

256 个可能字节值映射到 33 个号码,256 ÷ 33 = 7 余 25。前 25 个号(01–25)会出现 8 次,后 8 个号(26–33)只出现 7 次——概率被悄悄拉偏约 14%。拒绝采样把字节里超出的那段(这里 limit = 256 - 25 = 231,越界 25 个值)丢弃重抽,每个号才回到 1/33。

这一节逻辑在 logic.js 的 sampleUniform,单测 quantum-random.test.js 已覆盖。