是否需要手动调用rand.Seed?

Moj*_*and 4 random go

rand.Seed(n)我想知道Go中是否需要手动调用?
我有一个看起来像这样的代码:

import (
    "fmt"
    "math/rand"
)

func main() {
    fmt.Println(rand.Intn(100))
    fmt.Println(rand.Intn(100))
    fmt.Println(rand.Intn(100))
}
Run Code Online (Sandbox Code Playgroud)

每次我运行这段代码时,每一行都会打印出与其他行不同的数字。那么我每次
打电话之前都需要先打电话吗?rand.Seed(n)rand.Intn(100)

icz*_*cza 6

在 Go 1.20 之前,全局共享 Source 在内部被播种为 1,因此应用程序的每次运行都会产生相同的伪随机序列。

从 Go 1.20 开始不再需要调用。发行说明rand.Seed()

math/rand包现在自动为全局随机数生成器(由顶级函数(如Float64和)使用Int)提供随机值,并且顶级Seed函数已被弃用。需要可重现的随机数序列的程序应该更喜欢使用 来分配自己的随机源rand.New(rand.NewSource(seed))

需要早期一致的全局播种行为的程序可以GODEBUG=randautoseed=0在其环境中设置。

顶级Read函数已被弃用。几乎在所有情况下,crypto/rand.Read都更合适。

rand.Seed()其文档中也有此贬义:

已弃用:当依赖项更改从全局随机源消耗的数量时,调用 Seed 然后期望从全局随机源(使用 Int 等函数)获得特定结果序列的程序可能会被破坏。为了避免此类损坏,需要特定结果序列的程序应使用 NewRand(NewSource(seed)) 来获取其他包无法访问的随机生成器。