我想知道我们是否必须在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)
吗?
2条答案
按热度按时间k7fdbhmy1#
在Go 1.20之前,全局共享源在内部被播种为1,因此应用程序的每次运行都将产生相同的伪随机序列。
从Go 1.20开始不需要调用
rand.Seed()
。Release notes:**
math/rand
包现在会自动为全局随机数生成器(由Float64
和Int
等顶级函数使用)添加随机值,而顶级函数Seed
已被弃用。**需要可重复的随机数序列的程序应该首选使用rand.New(rand.NewSource(seed))
分配自己的随机源。需要更早的一致全局种子行为的程序可以在其环境中设置
GODEBUG=randautoseed=0
。顶级
Read
函数已弃用。在几乎所有情况下,crypto/rand.Read
更合适。rand.Seed()
在其文档中也有此DEPRICATION:已弃用:调用Seed然后期望从全局随机源获得特定结果序列的程序(使用Int等函数),当依赖改变了它从全局随机源消耗的量时,可能会被破坏。为了避免这种破坏,需要特定结果序列的程序应该使用NewRand(NewSource(seed))来获得其他包无法访问的随机生成器。
9vw9lbht2#
你需要创建一个源:
字符串
https://go.dev/play/p/Sp0Wfx0Bkbb
现在每次调用代码,结果都是相同的。