rand.Seed(SEED) 已弃用,如何使用 NewRand(NewSeed( ) )?

rea*_*ebo 36 go

我现在正在学习go。

我举个例子,我有这条线

rand.Seed(SEED) 
Run Code Online (Sandbox Code Playgroud)

但是关于 go 的 vscode 扩展告诉我

rand.Seed 自 Go 1.20 起已被弃用,自 Go 1.0 起出现了替代方案:调用 Seed 并期望从全局随机源(使用 Int 等函数)获得特定结果序列的程序在依赖项更改时可能会被破坏它从全局随机源消耗了多少。为了避免此类损坏,需要特定结果序列的程序应使用 NewRand(NewSource(seed)) 来获取其他包无法访问的随机生成器。(SA1019)

NewRand(NewSource(seed))我无法理解如何按照建议使用。

我找到了关于 NewSource 的文档https://pkg.go.dev/math/rand#NewSource

但没有关于NewRand函数的文档

新推荐的等效项是什么rand.Seed(SEED)

Cer*_*món 49

Go 1.20 种子文档有一个拼写错误。按照最新文档Go 1.20 发行说明rand.New(rand.NewSource(seed))中所述使用。

创建随机源并使用源上的方法而不是调用包函数:

  r := rand.New(rand.NewSource(seed))
  fmt.Println(r.Uint64())
  fmt.Println(r.Uint64())
Run Code Online (Sandbox Code Playgroud)

  • 看来随机生成器现在将在启动时自动播种 - 请参阅此处 VonC 的答案 - /sf/answers/5185424191/ (2认同)

小智 7

下面是一个示例,演示如何在 Go 版本 1.20 或更高版本中生成 1 到 15 之间的随机数:

// Create a new random number generator with a custom seed (e.g., current time)
source := rand.NewSource(time.Now().UnixNano())
rng := rand.New(source)

// Generate a random number of minutes between 1 and 15
randomMinutes := rng.Intn(15) + 1
Run Code Online (Sandbox Code Playgroud)