先挑好未来的抛硬币结果,再倒推出随机种子
来源: github.com/frazerpearce/TimeLord — 2026-09-28
概述
一个小型 Python 演示证明:伪随机数发生器产生的极其罕见的序列,并不代表真的撞上了惊人的好运。TimeLord 能为普通的 random.Random(seed) 构造出一个整数种子,让接下来的 100 次甚至 1000 次抛硬币全部是正面,而且没有任何猴子补丁或事后干预。
核心要点
- 关键在于种子是在指定期望结果之后才被选出来的,因此「100 次全正面的概率是 2⁻¹⁰⁰」这种算法预设了一个并不成立的前提。
- 100 次全正面概率约 7.9×10⁻³¹,1000 次约 9.3×10⁻³⁰²,只有在种子事先独立随机选定时,这种结果才算惊人。
- 每次正面只需约束输出位为 01,即每个正面只给 MT19937 两个比特约束;1000 次也才 2000 个约束,而它的内部状态约有两万比特,自由度极大。
- MT19937 的 twist 与 temper 都是 GF(2) 上的线性运算,可以用异或方程组表达,因此程序把状态比特符号化、按约束解方程,再自由填满其余比特。
- 更难的一步是反解 CPython 的整数种子初始化:程序倒推 624 个 32 位种子字,把它们合成一个大整数,最终调用依旧是普通的 random.Random(seed)。
- 演示脚本 demo_heads.py 里不含任何反推机制,任何人都能用同一个种子复现同样的 100 个正面——这恰好说明可复现性并不等于种子是独立随机选出的。
金句
因此,想要的结果不是被预测出来的,而是被选出来的。
👍 0
👎 0
← 返回 Lobsters 首页