Skip to content

Pseudo-Random Number Generator——伪随机数生成器,推理采样的随机性来源。ds4.c 使用 SplitMix64 算法。

为什么需要 PRNG

LLM 采样需要随机性:给定概率分布 [0.1, 0.3, 0.05, 0.55],需要按概率随机选择一个 token。PRNG 生成均匀随机数,然后通过"轮盘赌"算法映射到概率分布。

核心原理

SplitMix64 状态转移:
  state ^= state >> 12
  state ^= state << 25
  state ^= state >> 27
  output = state * 0x2545f4914f6cdd1d  // 乘法混合输出

特性:
  - 64 bit 状态,周期 2^64
  - 3 次位操作 + 1 次乘法,极快
  - 通过所有标准统计测试
  - 不可用于密码学(可预测)
  - 全零种子时用黄金比例常数 0x9e3779b97f4a7c15 替代

轮盘赌采样:

1. 生成 [0, 1) 均匀随机数 r
2. r *= sum(probs)     // 缩放到概率总和
3. 从第一个 token 开始累减: r -= probs[i]
4. 当 r ≤ 0 时返回当前 token i

在 ds4.c 中的实现

sample_rng_next() 函数封装 SplitMix64 状态。sample_rng_f32() 生成 [0,1) 浮点数用于采样。seed 参数控制可重现性——相同 seed 产生相同输出。

相关概念

  • softmax — PRNG 用于从 softmax 输出的概率分布中采样
  • bpe — 分词是确定性的,不涉及 PRNG

详见 Part 2 — 采样策略