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/