副标题 / 摘要
随机数生成是很多算法的基础。本文用线性同余法实现一个可复现的 rnd()。
目标读者
- 学习随机算法的开发者
- 需要理解 PRNG 的工程师
- 算法与系统基础学习者
背景 / 动机
大多数语言的随机数来自伪随机算法。
理解基础实现有助于评估随机性与可复现性。
核心概念
- 伪随机数(PRNG):由公式生成的序列
- 种子(Seed):决定序列起点
- 可复现性:同样种子产生相同序列
实践指南 / 步骤
- 选择线性同余参数
- 用种子初始化状态
- 每次调用更新状态并输出
- 将结果归一化到 [0,1)
可运行示例
class LCG:
def __init__(self, seed=1):
self.mod = 2 ** 31
self.a = 1103515245
self.c = 12345
self.state = seed
def rnd(self):
self.state = (self.a * self.state + self.c) % self.mod
return self.state / self.mod
if __name__ == "__main__":
rng = LCG(seed=42)
for _ in range(3):
print(rng.rnd())
解释与原理
线性同余法是最简单的 PRNG:
state = (a * state + c) mod m。
它速度快,但随机性质量有限。
常见问题与注意事项
LCG 安全吗?
不安全,不可用于加密。如何评估随机性?
需要统计测试(如均匀分布)。为何需要种子?
保证可复现,便于测试与调试。
最佳实践与建议
- 安全场景使用加密级随机数
- 需要可复现时固定种子
- 用库函数代替自研 PRNG
小结 / 结论
rnd() 可以用 LCG 轻松实现,但随机质量有限。
工程中应根据场景选择更合适的随机数算法。
参考与延伸阅读
- Numerical Recipes: Random Numbers
- Python random 模块文档
元信息
- 阅读时长:6~8 分钟
- 标签:随机数、PRNG
- SEO 关键词:rnd, 伪随机数
- 元描述:讲解 rnd() 的基础实现与注意事项。
行动号召(CTA)
用不同种子生成序列,观察随机分布是否均匀。