所以我想在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
}
但这似乎是一个解决方案,如果两个人同时运行此脚本,则随机数不是随机的。种子显然是执行的时间,在某些情况下这很可能是相同的。
这不是一种非常不准确的生成随机数的方法吗?我运行了几次,如果我运行得足够快,它就会给我相同的数字。对于随机数,是不是有更好的解决方案?比如,例如,使用密码术或其他东西作为种子?时间似乎并不是最好的种子。
答案 0 :(得分:4)
math/rand
并不意味着什么是安全的。要获得安全随机性,请使用crypto/rand
。
如果您只是想摆脱1秒的粒度,请使用time.Now().UnixNano()
代替time.Now().Unix()
。您还可以混合可能在系统之间变化的数据,例如os.Getpid()
或来自net.Interfaces()
的硬件地址,以防止不同的系统"意外地"同时生成相同的值(同样,这不是安全措施)。
对于介于两者之间的内容,请在crypto/rand
中从阅读器中读取64位,并使用 来播种math/rand
:)