go随机数

我们在通过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())
}