是否有Go函数在每次运行中返回真正的伪随机数?我的意思是,考虑下面的代码,
package main
import (
"fmt"
"rand"
)
func main() {
fmt.Println(rand.Int31n(100))
}
每次执行此代码时,都会得到相同的输出。有没有一种方法可以在每次调用它时返回不同的随机结果?
答案 0 :(得分:16)
包rand可用于生成伪随机数,这些伪随机数是根据特定的初始值(称为“种子”)生成的。
此初始种子的常用选择是例如以纳秒为单位的当前时间 - 当您多次执行程序时,该值可能会有所不同。您可以使用当前时间初始化随机生成器,如下所示:
rand.Seed(time.Now().UnixNano())
(不要忘记导入time包)
还有另一个叫做crypto/rand的软件包,它可用于生成更好的随机值(这个生成器也可能会考虑用户的鼠标移动,处理器的当前热量以及许多其他因素)。但是,这个包中的函数要慢几倍,除非你没有写一个密码生成器(或其他安全相关的东西),普通的rand包可能没问题。
答案 1 :(得分:1)
你必须首先播种RNG。
我从未使用过Go,但它可能是rand.Seed(x);
答案 2 :(得分:0)
rand.Seed(time.Now().UnixNano())
适用于Ubuntu。我花了很多时间研究rand.Seed(time.Nanoseconds())
。我终于在golang之旅中找到了示例:Google Search 2.1。