如何在官方的“围棋之旅”中播种随机数生成器?

jonsanders101:

Go的官方浏览在沙盒中提供了以下代码:

package main

import (
    "fmt"
    "math/rand"
)

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

而这条指令:

注意:执行这些程序的环境是确定性的,因此,每次运行示例程序rand.Intn都将返回相同的数字。(要查看其他数字,请给数字生成器添加种子;请参阅rand.Seed。)

阅读rand.Seed官方文档下的条目并阅读此答案后,我仍然无法正确植入随机数生成器。

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

非常感谢,乔恩

jeevatkm:

默认情况下rand.Intn使用globalRand.Intn它是内部创建的,请参见此处因此,当您通过rand.Seed进行设置时

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

然后globalRand使用新的种子值。

需要时,您可以创建具有种子值的自己的rand生成器。请参阅godoc示例


播放链接(无种子):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所述,在操场上程序的执行是deterministic但是,游乐场不会阻止您提供rand.Seed价值。

请记住,种子值是int64

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

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

自从以来,在操场上time.Now().UTC().UnixNano()给你一样的价值但这与默认种子值不同,这就是第二个游乐场链接产生不同结果的原因1257894000000000000the start time is locked to a constant

因此,以上两个总是会产生相同的结果。

我们应该如何在运动场中更改结果?

我们可以。让我们的供应UnixNano()1500909006430687579rand.Seed,这是从我的机器产生。

播放链接: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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章