Go Rand套餐难度很大

时间:2011-11-27 20:13:01

标签: go

是否有Go函数在每次运行中返回真正的伪随机数?我的意思是,考虑下面的代码,

package main

import (
    "fmt"
    "rand"
)

func main() {
    fmt.Println(rand.Int31n(100))
}

每次执行此代码时,都会得到相同的输出。有没有一种方法可以在每次调用它时返回不同的随机结果?

3 个答案:

答案 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。