背景
在计算机科学中,随机数是一个看似简单、却极其基础且重要的概念。
在现实世界中,随机性来源于物理过程(噪声、量子现象等),但在计算机中:
绝大多数所谓的'随机数',其实都是'伪随机数'
也就是说,它们是通过确定性的数学公式生成的,只是'看起来像随机'。
在所有伪随机数生成算法中,Linear Congruential Generator(LCG,线性同余发生器)是:
- 历史最悠久
- 结构最简单
- 数学形式最清晰
- 教学中最常见
的一类算法。
LCG 早在 1950 年代就被提出,并长期作为:
- C 语言 rand() 的实现基础
- 教材中的随机数生成示例
- 嵌入式系统、早期操作系统的默认 PRNG
尽管在现代安全或高质量随机场景中,LCG 已不再推荐,但它在理解随机数生成原理、数论与工程实现之间的关系方面,仍然具有不可替代的教学价值。
因此,用 Go 语言实现 LCG,是一个非常适合算法教学、原理讲解、工程对照的经典项目。
需求
本项目的目标是:
使用 Go 语言完整实现一个 Linear Congruential Generator(线性同余发生器),并生成可重复的伪随机数序列。
具体需求如下:
1. 功能需求
- 实现标准 LCG 递推公式
- 支持自定义参数:模数 m、乘数 a、增量 c、初始种子 seed
- 可连续生成随机数序列
- 支持生成指定范围内的随机数
2. 算法要求
- 严格遵循 LCG 数学定义
- 所有计算使用整数运算
- 不依赖 Go 内置 math/rand
3. 工程要求
- 结构清晰,便于封装
- 状态可控,可复现
- 代码注释完整,适合教学
4. 教学要求
- 明确解释公式中每个参数的意义
- 说明 LCG 的周期问题
- 指出该算法的优缺点与适用场景
技术原理
1. 线性同余发生器的数学定义
LCG 的核心递推公式为:
Xₙ₊₁ = (a · Xₙ + c) mod m
其中:
- Xₙ:当前随机数
- Xₙ₊₁:下一个随机数
- m:模数(决定周期上限)
- a:乘数
- c:增量
- X₀:初始种子(seed)
所有'随机性'的来源,完全来自这一个公式。
2. 参数的数学意义
(1)模数 m
- 决定随机数取值范围:[0, m)
- 决定最大周期长度(理论上 ≤ m)
(2)乘数 a
- 决定序列的'扩散性'
- 不合理的 a 会导致序列规律明显
(3)增量 c
- 若 c = 0,称为乘同余发生器
- 若 c ≠ 0,称为混合同余发生器
- c 的存在有助于避免退化
(4)种子 seed
- 决定整个随机序列

