在 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.NewSourcerand.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,但适用于安全敏感场景。