函数和
Rand.Uint64()
方法,所以你可以直接使用它们。其余答案早于 Go 1.8。
最简单的方法是拨打
两次:
func Uint64() uint64 {
return uint64(rand.Uint32())<<32 + uint64(rand.Uint32())
}
另一种选择是调用
(在 Go 1.7 中添加)读取 8 个字节,然后使用
encoding/binary
包从中获取
uint64
值:func Uint64() uint64 {
buf := make([]byte, 8)
rand.Read(buf) // Always succeeds, no need to check error
return binary.LittleEndian.Uint64(buf)
}
注意:正如
rand.Read()
的文档所述,它总是读取与传递的切片长度一样多的字节,并且它总是返回
nil
错误,因此在这种情况下不需要检查错误。注意 #2:您也可以使用 binary.BigEndian
代替
binary.LittleEndian
,因为我们使用其所有字节生成随机数,字节顺序完全无关。b := make([]byte, 8)
_, err := rand.Read(b)
return binary.LittleEndian.Uint64(b), err
crypto/rand
比
math/rand
更安全,但一些 linter 抱怨它与 G404:使用弱随机数生成器(数学/兰德而不是加密/兰德)我推荐类似以下功能的东西
func Int64() int64 {
nBig, err := cryptoRand.Int(cryptoRand.Reader, big.NewInt(math.MaxInt64))
if err != nil {
return 0
}
return nBig.Int64()
}