Appearance
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 产生相同输出。
相关概念
详见 Part 2 — 采样策略。