【发布时间】:2012-10-10 23:45:19
【问题描述】:
是否有任何 Go 函数在每次运行时都返回真正的伪随机数?我的意思是,考虑下面的代码,
package main
import (
"fmt"
"rand"
)
func main() {
fmt.Println(rand.Int31n(100))
}
每次执行此代码时,我都会得到相同的输出。是否有一种方法会在每次调用时返回不同的随机结果?
【问题讨论】:
标签: go
是否有任何 Go 函数在每次运行时都返回真正的伪随机数?我的意思是,考虑下面的代码,
package main
import (
"fmt"
"rand"
)
func main() {
fmt.Println(rand.Int31n(100))
}
每次执行此代码时,我都会得到相同的输出。是否有一种方法会在每次调用时返回不同的随机结果?
【问题讨论】:
标签: go
包rand可用于生成伪随机数,这些伪随机数是根据特定的初始值(称为“种子”)生成的。
这个初始种子的一个流行选择是例如以纳秒为单位的当前时间 - 当您多次执行程序时,这个值可能会有所不同。您可以使用当前时间初始化随机生成器,如下所示:
rand.Seed(time.Now().UnixNano())
(不要忘记为此导入 time 包)
还有另一个名为crypto/rand 的包可用于生成更好的随机值(此生成器可能还会考虑用户的鼠标移动、处理器的当前热量和许多其他因素)。但是,这个包中的功能要慢几倍,除非你不编写密码短语生成器(或其他与安全相关的东西),否则普通的 rand 包可能没问题。
【讨论】:
你必须先播种 RNG。
我没用过 Go,不过应该是rand.Seed(x);
【讨论】:
rand.Seed(time.Now().UnixNano()) 在 Ubuntu 上工作。我一直在研究rand.Seed(time.Nanoseconds())。我终于在 golang tour 上找到了 Example: Google Search 2.1。
【讨论】: