在 Go 语言中,生成一个整数范围内的随机整数是常见的编程任务,例如在游戏、模拟或测试场景中。Go 的标准库 math/rand
提供了强大的随机数生成功能,但需要注意初始化和范围限制。
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
// 初始化随机数种子,确保每次运行结果不同
rand.Seed(time.Now().UnixNano())
// 生成一个 0 到 99 之间的随机整数
randomNum := rand.Intn(100)
fmt.Println("随机整数:", randomNum)
}
注意:在 Go 1.20
及更高版本中,rand.Seed 已被弃用,推荐使用 rand.NewSource 和
rand.New 来创建独立的随机数生成器。
使用 rand.Intn 函数
rand.Intn(n) 函数返回一个范围在 [0, n) 的随机整数,其中 n
是上限(不包含)。例如,要生成 1 到 10 之间的随机整数,可以调整范围。
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
// 生成 1 到 10 的随机整数
min := 1
max := 10
randomNum := rand.Intn(max - min + 1) + min
fmt.Println("随机整数 (1-10):", randomNum)
}
在这个示例中,rand.Intn(max - min + 1) 生成 0 到 9 的随机数,然后加上 min
来偏移到 1 到 10 的范围。
生成指定范围的随机整数
对于任意整数范围
[a, b],可以使用通用公式:rand.Intn(b - a + 1) + a。下面是一个更灵活的示例。
package main
import (
"fmt"
"math/rand"
"time"
)
func generateRandomInRange(min, max int) int {
if min > max {
min, max = max, min // 交换以确保 min <= max
}
return rand.Intn(max - min + 1) + min
}
func main() {
rand.Seed(time.Now().UnixNano())
// 生成 -50 到 50 的随机整数
randomNum := generateRandomInRange(-50, 50)
fmt.Println("随机整数 (-50 到 50):", randomNum)
}
提示:函数 generateRandomInRange
处理了输入参数顺序错误的情况,确保范围有效。
使用 crypto/rand 生成安全随机数
如果应用需要加密安全的随机数(如生成密钥),应使用 crypto/rand 包。它提供了 rand.Int
函数来生成大范围随机整数。
package main
import (
"crypto/rand"
"fmt"
"math/big"
)
func main() {
// 生成一个 0 到 999 的随机整数
max := big.NewInt(1000)
randomNum, err := rand.Int(rand.Reader, max)
if err != nil {
panic(err)
}
fmt.Println("安全随机整数:", randomNum)
}
crypto/rand 的性能通常低于 math/rand,但适用于安全敏感场景。