go - 如何在官方围棋之旅中播种随机数生成器?

标签 go random numbers generator seed

Go官方给出沙箱中的代码如下:

package main

import (
    "fmt"
    "math/rand"
)

func main() {
    fmt.Println("My favorite number is", rand.Intn(10))
}

这条指令:

Note: the environment in which these programs are executed is deterministic, so each time you run the example program rand.Intn will return the same number. (To see a different number, seed the number generator; see rand.Seed.)

阅读rand.Seed官方文档下的条目后和阅读 this answer ,我仍然无法正确地为随机数生成器设置种子。

有人可以演示如何使用 rand.Seed 函数为随机数生成器设置种子吗?

非常感谢, 乔恩

最佳答案

默认情况下 rand.Intn 使用 globalRand.Intn .它是内部创建的,refer here .所以当你通过 rand.Seed 设置时

rand.Seed(time.Now().UTC().UnixNano())

然后 globalRand 使用新的种子值。

如果需要,您可以创建自己的带有种子值的随机数生成器。引用godoc example .


播放链接(无种子):https://play.golang.org/p/2yg7xjvHoJ

输出:

My favorite number is 1
My favorite number is 7
My favorite number is 7
My favorite number is 9
My favorite number is 1
My favorite number is 8
My favorite number is 5
My favorite number is 0
My favorite number is 6

播放链接(带种子):https://play.golang.org/p/EpW6R5rvM4

输出:

My favorite number is 0
My favorite number is 8
My favorite number is 7
My favorite number is 2
My favorite number is 3
My favorite number is 9
My favorite number is 4
My favorite number is 7
My favorite number is 8

编辑:

正如@AlexanderTrakhimenok 提到的,在 playground 中程序执行是确定性的。但是,playground 不会阻止您提供 rand.Seed 值。

记住种子值是int64

当您rand.Intn 时,它使用globalRand 的默认种子值1

var globalRand = New(&lockedSource{src: NewSource(1).(Source64)})

在 playground 中 time.Now().UTC().UnixNano() 给你相同的值 1257894000000000000 因为 开始时间被锁定为一个常量。但它与默认种子值不同,这就是第二个 Playground 链接产生不同结果的原因

所以上面两个总是会产生相同的结果。

我们应该如何改变 Playground 上的结果?

是的,我们可以。让我们向 rand.Seed 提供 UnixNano()1500909006430687579,它是从我的机器生成的。

播放链接:https://play.golang.org/p/-nTydej8YF

输出:

My favorite number is 3
My favorite number is 5
My favorite number is 3
My favorite number is 8
My favorite number is 0
My favorite number is 5
My favorite number is 4
My favorite number is 7
My favorite number is 1

关于go - 如何在官方围棋之旅中播种随机数生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45268998/

相关文章:

javascript - 使用 JavaScript 挑选不重复的随机数

C语言: How to get number from string via sscanf?

javascript - 在 JavaScript 中创建类似于 Number 的对象

postgresql - 尝试插入 postgresql 时 conn 关闭

go - 在 Go 中进行类型转换时进行错误检查

python - 我是在随机生成器中偶然发现了某种模式,还是得到了极其罕见的东西?

delphi - 随机化多个字符串列表

javascript - 如何生成没有重复javascript的随机数

go - 服务/方法请求格式错误

http - 服务器认为所有请求都有 r.Method "GET"