📜  Golang 中的 rand 包(1)

📅  最后修改于: 2023-12-03 15:31:01.520000             🧑  作者: Mango

Golang 中的 rand 包

Go 语言中的 rand 包提供了伪随机数生成器,可用于生成随机数、打乱数组等应用。本文将介绍该包的使用。

生成随机数

生成随机数可以使用 rand 包的 Intn(n int) int 函数,该函数返回一个范围在 [0, n) 的伪随机数。

示例代码:

package main

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

func main() {
    rand.Seed(time.Now().UnixNano()) // 设置随机数种子
    fmt.Println(rand.Intn(100)) // 生成一个 0~99 的随机数
}
打乱数组

打乱数组可以使用 rand 包的 Shuffle(n int, swap func(i, j int)) 函数,该函数接受一个数组长度 n 和一个交换元素的函数 swap,将数组随机打乱。

示例代码:

package main

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

func main() {
    rand.Seed(time.Now().UnixNano()) // 设置随机数种子

    arr := []int{1, 2, 3, 4, 5}
    rand.Shuffle(len(arr), func(i, j int) {
        arr[i], arr[j] = arr[j], arr[i] // 交换 i、j 元素
    })
    fmt.Println(arr) // [5 2 1 4 3],输出打乱后的数组
}
随机生成数字

随机生成数字可以使用 rand 包的 Int() 函数,该函数返回一个 int 类型的伪随机数。还可以使用 Int63(), Uint32(), Uint64() 等函数生成不同类型的随机数。

示例代码:

package main

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

func main() {
    rand.Seed(time.Now().UnixNano()) // 设置随机数种子

    fmt.Println(rand.Int()) // 输出一个 int 类型的随机数
}
随机生成字母

随机生成字母可以先生成随机数,再将其转换成 ASCII 码对应的字母。也可以使用 rand 包的 Read() 函数生成字节数组,再将其转换成字符串。

示例代码:

package main

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

func main() {
    rand.Seed(time.Now().UnixNano()) // 设置随机数种子

    for i := 0; i < 10; i++ {
        c := 'a' + rand.Intn(26) // 生成 a~z 范围内的随机字母
        fmt.Printf("%c ", c) // 输出字母
    }
    fmt.Println()

    b := make([]byte, 10)
    rand.Read(b)                   // 生成 10 个随机字节
    fmt.Println(string(b))         // 将字节数组转换为字符串
}
设置随机数种子

通常情况下,每次程序运行都会生成不同的伪随机数序列。如果需要让多次运行程序生成相同的伪随机数序列,可以设置随机数种子。

设置随机数种子可以使用 rand 包的 Seed(seed int64) 函数,该函数接受一个 int64 类型的参数,将其作为种子生成随机数。

示例代码:

package main

import (
    "fmt"
    "math/rand"
)

func main() {
    rand.Seed(42) // 设置随机数种子,相同的种子生成相同的伪随机数序列

    for i := 0; i < 10; i++ {
        fmt.Println(rand.Intn(100))
    }
}

以上就是 rand 包的使用介绍,更多内容请参考官方文档。