贝利信息

如何使用Golang math/rand生成随机数_整数、浮点和种子控制

日期:2026-01-11 00:00 / 作者:P粉602998670
math/rand非加密安全,适用于模拟等场景;Go 1.20起推荐crypto/rand用于密码学随机;用r.Intn(n)得[0,n),min+r.Intn(max-min+1)得[min,max];r.Float64()返回[0.0,1.0),缩放可调范围;应显式创建Rand实例并用time.Now().UnixNano()等设种子。

Go 语言中 math/rand 包用于生成伪随机数,但要注意它**不是加密安全的**,仅适用于模拟、测试、游戏逻辑等场景。从 Go 1.20 开始,推荐优先使用 crypto/rand 做密码学强度随机(如生成密钥),而 math/rand 仍是最常用的基础随机工具。

生成随机整数(int)

使用 Rand.Intn(n) 可生成 [0, n) 范围内的随机整数(左闭右开)。若需自定义范围 [min, max](含两端),需手动偏移和缩放:

生成随机浮点数(float64)

math/rand 提供了多个浮点方法,注意它们返回的默认范围:

种子(Seed)控制与注意事项

种子决定随机序列的起始点。相同种子 → 完全相同的随机数序列(对可复现测试非常有用):

完整示例代码

以下是一个安全、现代、可直接运行的示例:

package main

import ( "fmt" "math/rand" "time" )

func main() { // 使用当前纳秒时间作为种子,创建独立随机生成器 r := rand.New(rand.NewSource(time.Now().UnixNano()))

// 随机整数:1~100(含)
n := 1 + r.Intn(100)
fmt.Println("随机整数:", n)

// 随机浮点:[0.0, 5.0)
f := r.Float64() * 5.0
fmt.Printf("随机浮点: %.3f\n", f)

// 固定种子用于可复现结果(比如测试)
reproducible := rand.New(rand.NewSource(123))
fmt.Println("固定种子第1次:", reproducible.Intn(10))
fmt.Println("固定种子第2次:", reproducible.Intn(10)) // 每次运行都一样

}