我们在通过go获取随机数时,会发现每次获取的均一致,如下面的程序,无论执行多少次,打印的结果均是81、87、47、59
for i := 0; i < 40; i++ {
println(rand.Intn(100))
}
81
87
47
59
这是因为在默认情况下,go的rand会使用相同的源来产生一个确定的伪随机数序列,即产生一个不变的数列。
由于源代码已经发布到 Go 的官方标准库中,因此任何运行此程序的计算机都会得到相同的结果。
但是,由于 Go 仅保留一个生成的数字序列,我们可能想知道 Go 是如何管理用户请求的时间间隔的。Go 实际上使用此数字序列来播种一个产生这个随机数的源,然后获取其请求间隔的模。例如,运行相同的程序,最大值为 10,则模 10 的结果相同。
如果要每次执行获取不同的结果,可初始化这个默认序列
func main() {
rand.Seed(time.Now().UnixNano())
for i := 0; i < 4; i++ {
println(rand.Intn(100))
}
var currentTime time.Time = time.Now();
println(currentTime.String())
random := rand.Intn(100);
println(random)
second := time.Duration(random) * time.Second;
currentTime = currentTime.Add(second)
println(currentTime.String())
}