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函数为随机数生成器生成种子吗?
非常感谢,乔恩
默认情况下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
,它使用默认的种子值1
的globalRand
。
var globalRand = New(&lockedSource{src: NewSource(1).(Source64)})
自从以来,在操场上time.Now().UTC().UnixNano()
给你一样的价值。但这与默认种子值不同,这就是第二个游乐场链接产生不同结果的原因。1257894000000000000
the start time is locked to a constant
因此,以上两个总是会产生相同的结果。
我们应该如何在运动场中更改结果?
我们可以。让我们的供应UnixNano()
值1500909006430687579
来rand.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] 删除。
我来说两句