登录
首页 >  Golang >  Go问答

rand.Seed的使用是否必要?

来源:stackoverflow

时间:2024-02-08 12:00:25 152浏览 收藏

Golang不知道大家是否熟悉?今天我将给大家介绍《rand.Seed的使用是否必要?》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出,谢谢!希望我们能一起加油进步!

问题内容

我想知道我们是否必须在 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) 吗?


正确答案


在 go 1.20 之前,全局共享 source 在内部播种为 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() 在其文档中也有此贬义:

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

您必须创建一个源:

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

现在每次调用代码时,结果都会变得相同。

到这里,我们也就讲完了《rand.Seed的使用是否必要?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>