背景
在计算机科学中,随机数是一个看似简单、却极其基础且重要的概念。
在现实世界中,随机性来源于物理过程(噪声、量子现象等),但在计算机中:
绝大多数所谓的'随机数',其实都是'伪随机数'
也就是说,它们是通过确定性的数学公式生成的,只是'看起来像随机'。
在所有伪随机数生成算法中,Linear Congruential Generator(LCG,线性同余发生器)是:
- 历史最悠久
- 结构最简单
- 数学形式最清晰
- 教学中最常见
的一类算法。
LCG 早在 1950 年代就被提出,并长期作为:
本文介绍了线性同余发生器(LCG)的原理及其在 Go 语言中的实现。LCG 是一种经典的伪随机数生成算法,通过确定性公式 Xₙ₊₁ = (a · Xₙ + c) mod m 生成序列。文章详细解析了模数、乘数、增量和种子的数学意义,以及 Hull–Dobell 定理对周期的影响。提供了完整的 Go 代码示例,包含结构体定义、Next 方法生成随机数及范围映射功能。最后总结了 LCG 的教学价值、优缺点及适用场景,强调其不适用于安全加密场景。
在计算机科学中,随机数是一个看似简单、却极其基础且重要的概念。
在现实世界中,随机性来源于物理过程(噪声、量子现象等),但在计算机中:
绝大多数所谓的'随机数',其实都是'伪随机数'
也就是说,它们是通过确定性的数学公式生成的,只是'看起来像随机'。
在所有伪随机数生成算法中,Linear Congruential Generator(LCG,线性同余发生器)是:
的一类算法。
LCG 早在 1950 年代就被提出,并长期作为:
尽管在现代安全或高质量随机场景中,LCG 已不再推荐,但它在理解随机数生成原理、数论与工程实现之间的关系方面,仍然具有不可替代的教学价值。
因此,用 Go 语言实现 LCG,是一个非常适合算法教学、原理讲解、工程对照的经典项目。
本项目的目标是:
使用 Go 语言完整实现一个 Linear Congruential Generator(线性同余发生器),并生成可重复的伪随机数序列。
具体需求如下:
LCG 的核心递推公式为:
Xₙ₊₁ = (a · Xₙ + c) mod m
其中:
所有'随机性'的来源,完全来自这一个公式。
LCG 想要达到最大周期 m,必须满足:
这也是很多'坏随机数'的根源所在。
本项目的实现思路如下:
用于保存:
// ==========================================
// 文件名:lcg.go
// 功能:Linear Congruential Generator(线性同余发生器)
// ==========================================
package main
import "fmt"
// LCG 表示一个线性同余随机数发生器
type LCG struct {
a uint64 // 乘数
c uint64 // 增量
m uint64 // 模数
current uint64 // 当前状态
}
// NewLCG 创建一个新的 LCG 实例
func NewLCG(seed, a, c, m uint64) *LCG {
return &LCG{
a: a,
c: c,
m: m,
current: seed,
}
}
// Next 生成下一个伪随机数
func (l *LCG) Next() uint64 {
l.current = (l.a*l.current + l.c) % l.m
return l.current
}
// NextIntInRange 生成指定区间 [min, max) 的随机整数
func (l *LCG) NextIntInRange(min, max uint64) uint64 {
if max <= min {
return min
}
return min + l.Next()%(max-min)
}
func main() {
// 一组经典 LCG 参数(类似 glibc 早期实现)
const (
m = 1 << 31
a = 1103515245
c = 12345
)
seed := uint64(42)
lcg := NewLCG(seed, a, c, m)
fmt.Println("生成的伪随机数序列:")
for i := 0; i < 10; i++ {
fmt.Println(lcg.Next())
}
fmt.Println("生成 [10, 100) 范围内的随机数:")
for i := 0; i < 5; i++ {
fmt.Println(lcg.NextIntInRange(10, 100))
}
}
用于保存线性同余发生器的全部状态与参数,是算法的核心载体。
通过本项目,我们完整实现并理解了:
LCG 的意义不在于'好不好用',而在于:
它是理解所有现代随机数算法的起点
不是,它是伪随机,完全可预测。
不安全,绝不能用于加密、安全、Token 等场景。
因为:

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online