Go语言 是否需要手动调用兰德?

bvuwiixz  于 2023-08-01  发布在  Go
关注(0)|答案(2)|浏览(161)

我想知道我们是否必须在Go中手动调用rand.Seed(n)
我有一个代码,看起来像这样:

import (
    "fmt"
    "math/rand"
)

func main() {
    fmt.Println(rand.Intn(100))
    fmt.Println(rand.Intn(100))
    fmt.Println(rand.Intn(100))
}

字符串
每次我运行这段代码时,每一行都打印出不同的数字。
那么每次调用rand.Intn(100)之前都需要调用rand.Seed(n)吗?

k7fdbhmy

k7fdbhmy1#

在Go 1.20之前,全局共享源在内部被播种为1,因此应用程序的每次运行都将产生相同的伪随机序列。
从Go 1.20开始不需要调用rand.Seed()Release notes

**math/rand包现在会自动为全局随机数生成器(由Float64Int等顶级函数使用)添加随机值,而顶级函数Seed已被弃用。**需要可重复的随机数序列的程序应该首选使用rand.New(rand.NewSource(seed))分配自己的随机源。

需要更早的一致全局种子行为的程序可以在其环境中设置GODEBUG=randautoseed=0
顶级Read函数已弃用。在几乎所有情况下,crypto/rand.Read更合适。
rand.Seed()在其文档中也有此DEPRICATION:
已弃用:调用Seed然后期望从全局随机源获得特定结果序列的程序(使用Int等函数),当依赖改变了它从全局随机源消耗的量时,可能会被破坏。为了避免这种破坏,需要特定结果序列的程序应该使用NewRand(NewSource(seed))来获得其他包无法访问的随机生成器。

9vw9lbht

9vw9lbht2#

你需要创建一个源:

package main

import (
    "fmt"
    "math/rand"
)

func main() {
    wdRand := rand.New(rand.NewSource(42))
    fmt.Println(wdRand.Intn(100))
    fmt.Println(wdRand.Intn(100))
    fmt.Println(wdRand.Intn(100))
}

字符串
https://go.dev/play/p/Sp0Wfx0Bkbb
现在每次调用代码,结果都是相同的。

相关问题