Go生成随机数需设种子,否则结果固定;安全场景须用crypto/rand。math/rand需初始化种子,1.20+推荐rand.New(rand.NewSource(time.Now().UnixNano())),Intn(n)生成[0,n),闭区间[a,b]用a+r.Intn(b-a+1),浮点数用Float32/64,安全敏感场景禁用math/rand。

Go 语言中生成随机数主要靠 math/rand 包,但要注意:它默认不带真随机性,需手动设置种子(seed),否则每次运行结果都一样。
初始化 rand.Seed(必须做)
在 Go 1.20 之前,需要用 rand.Seed() 设置随机种子;1.20+ 版本推荐使用 rand.New(rand.NewSource()) 的方式,避免全局状态干扰。
- 老写法(兼容旧版本):
rand.Seed(time.Now().UnixNano()) - 新写法(推荐):
r := rand.New(rand.NewSource(time.Now().UnixNano())),后续用r.Intn(100)等方法 - 不设种子 → 每次程序运行都输出相同“随机”序列,调试时可能误以为逻辑出错
生成指定范围的整数
最常用的是 Intn(n),返回 [0, n) 范围内的随机整数(不含 n)。
- 比如
r.Intn(10)得到 0~9 的整数 - 要生成 [a, b] 闭区间整数?写成
a + r.Intn(b-a+1) - 例如:[5, 15] →
5 + r.Intn(11)
生成浮点数和其它类型
rand 还提供多种基础类型支持:
立即学习“go语言免费学习笔记(深入)”;
-
r.Float32():返回 [0.0, 1.0) 的 float32 -
r.Float64():返回 [0.0, 1.0) 的 float64 -
r.Int():返回 int 范围内的随机整数(注意可能溢出) - 想生成 [0.5, 2.5) 的 float64?用
0.5 + r.Float64()*2.0
安全场景别用 math/rand
如果用于密码、token、加密密钥等安全敏感场景,math/rand 不够安全 —— 它是伪随机,可预测。
- 应改用
crypto/rand包 - 例如:
crypto/rand.Int(rand.Reader, big.NewInt(100))生成安全随机整数 - 注意:
crypto/rand性能较低,日常逻辑、游戏、测试用math/rand就够了
基本上就这些。关键就两点:记得设种子,安全场景换 crypto/rand。










