带时间包的随机数

时间:2018-03-15 08:10:51

标签: go random

所以我想在Go中生成一个随机数,推荐的方法显然是使用这样的东西:

package main
import(
    "fmt"
    "math/rand"
    "time"
)

func random(min, max int) int {
    rand.Seed(time.Now().Unix())
    return rand.Intn(max - min) + min
}

但这似乎是一个解决方案,如果两个人同时运行此脚本,则随机数不是随机的。种子显然是执行的时间,在某些情况下这很可能是相同的。

这不是一种非常不准确的生成随机数的方法吗?我运行了几次,如果我运行得足够快,它就会给我相同的数字。对于随机数,是不是有更好的解决方案?比如,例如,使用密码术或其他东西作为种子?时间似乎并不是最好的种子。

1 个答案:

答案 0 :(得分:4)

math/rand并不意味着什么是安全的。要获得安全随机性,请使用crypto/rand

如果您只是想摆脱1秒的粒度,请使用time.Now().UnixNano()代替time.Now().Unix()。您还可以混合可能在系统之间变化的数据,例如os.Getpid()或来自net.Interfaces()的硬件地址,以防止不同的系统"意外地"同时生成相同的值(同样,这不是安全措施)。

对于介于两者之间的内容,请在crypto/rand中从阅读器中读取64位,并使用 来播种math/rand:)