在Go中生成随机数的方法

1,133 阅读2分钟

要在Go中生成一个随机数(实际上是伪随机数,但在本文中,我们将其称为随机数),你只需要使用 math/rand包。

生成随机的整数(也是在给定的范围内)

package main
import (
"fmt"
"math/rand"
"time"
)
func randInt(min, max int) int {
return min + rand.Intn(max-min)
}
func main() {
rand.Seed(time.Now().UnixNano())
fmt.Printf("random integer: %d\n", rand.Int())
fmt.Printf("random integer in range [5, 10): %d\n", randInt(5, 10))
}

生成随机的float64数字(也在给定范围内)

package main
import (
"fmt"
"math/rand"
"time"
)
func randFloat(min, max float64) float64 {
return min + rand.Float64()*(max-min)
}
func main() {
rand.Seed(time.Now().UnixNano())
fmt.Printf("random float64: %f\n", rand.Float64())
fmt.Printf("random float64 in range [2.4, 3.2): %f\n", randFloat(2.4, 3.2))
}

它是如何工作的

  1. Seed

    rand.Seed(time.Now().UnixNano())
    

    main 函数的第一行,我们设置种子来初始化一个伪随机数生成器。默认的 math/rand数字发生器是确定性的,所以它将为相同的种子值提供相同的输出序列。你可以通过删除主函数的第一行并运行几次程序来检查这一点--我们总是得到相同的 "随机 "数字。这是因为该算法通过对前一个值进行一些操作来产生新的值,当初始值(种子值)保持不变时,我们得到的输出数字是一样的。为了避免这种情况,我们使用当前时间--time.Now().UnixNano() 作为种子。

  2. 随机数生成函数

    fmt.Printf("random integer: %d\n", rand.Int())
    fmt.Printf("random float64: %f\n", rand.Float64())
    

    在种子初始化之后,我们可以使用其中的一个 math/rand包函数生成一个随机数,例如:

    参见 math/rand包的文档以获得更多信息。

  3. 一个范围内的随机数

    func randInt(min, max int) int {
    return min + rand.Intn(max-min)
    }
    

    包中没有任何函数可以在 math/rand包中没有函数可以生成[min, max) 范围内的随机数,所以我们必须将函数 rand.Intn()rand.Float64()来实现类似的结果。该 rand.Intn()可以生成一个范围为[0, n) 的值,所以为了得到一个范围为[min, max) 的值,我们需要生成一个范围为[0, max-min) 的值,然后在结果中加上min

    rand.Float64()产生的数字在[0.0, 1.0) 。为了得到[min, max) 范围内的数字,将结果乘以max-min ,再加上min