Skip to contents

做了什么

  • src/rust/engine/src/rng.rs:PCG64(O’Neill pcg-cpp pcg64 构型:u128 LCG,乘数 0x2360ED05…,XSL-RR 输出)+ SplitMix64 扩展器(公开 KAT 命中:seed 0 → 0xe220a839…)+ 流布局 v1(LAYOUT_ID = “MSURNGV1” 域分离;mix64 链吸收 (master_seed, replicate, rank, fold) 四词 → SplitMix64 展开 (initstate, initseq) → pcg 两步播种)。布局规范以论文 Methods 可引用的英文成文,含五点分离性论证(诚实定性为 Methods-grade sketch,披露 mix64(0)=0 定点的 2⁻⁶⁴ 触达与链自恢复)。
  • 测试 8 条双工具链(stable 1.97.1 与 MSRV 1.71.0)全绿:3 组 golden(前 16 u64 硬编码冻结)、18 流分离性网格、KAT、确定性、全域覆盖 property。TDD 过程实证:coverage 测试先抓出实现者自己的概率窗口错误。

关键决策(契约引用)

  • A6/D6:零依赖自研(Cargo.lock 零变化;deny 拦 rand 族);跨版本 golden 冻结。
  • ★ 终审修正(P1)——canonical pcg64 输出位:原实现取步进前状态输出(照搬 pcg_basic 的 pcg32 习惯);审核员引 pcg-cpp output_previous = (sizeof(itype) <= 8) 与 numpy 实测证明 128 位态的 canonical pcg64 取步进后输出,否则第三方按 Methods 复现会 off-by-one。已改为 post-step、三组 golden 以独立 /tmp 探针 crate 重生成(新序列 = 旧序列右移一位,与 numpy 证据吻合)、文档改写并记录重生成缘由。教训:双重自研实现共读同一文档时会共谋出错——外部 oracle(numpy/上游 KAT)不可省。
  • 独立验证工件:tools/rng-kat.py(纯 stdlib)从 rng.rs 源码解析 LAYOUT_ID/PCG_MULT/golden 数组并独立重算比对 + SplitMix64 公开 KAT;终审审核员更以”派生 (state,inc) 注入 numpy PCG64”完成最强 oracle 复核(48 词逐位吻合)。CI 接线归 U-M0-07。

审核(3 轮,联合)

第 1 轮 REVISE(golden 交叉验证无入库工件)→ rng-kat.py;第 2 轮 REVISE(输出位约定 P1)→ post-step 修正 + golden 重生成;第 3 轮 PASS。

遗留

  • next_u32/next_f64/advance 接口留白 → U-M1s-04(resample)按需提出;加 advance 需补 LCG 跳转 golden。
  • StreamId 域宽未构造性限界(雪崩论证 + 2⁻⁶⁴/对 + 网格实证);论文 Methods 措辞纪律:须写 “domain-separated derivation, per-pair collision ≈2⁻⁶⁴, empirically grid-verified”,禁写 “provably disjoint streams”。
  • golden 副本随论文 Methods 定稿在 docs/ 侧登记(终审建议)。