Go math/random
库缺少一个生成64位数字的函数。这已经an open issue大约四年了。与此同时,变通方法是什么样的?
答案 0 :(得分:9)
最简单的方法是拨打rand.Uint32()
两次:
func Uint64() uint64 {
return uint64(rand.Uint32())<<32 + uint64(rand.Uint32())
}
另一种选择是调用rand.Read()
(was added in 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
,因为我们使用其所有字节生成随机数,字节顺序完全无关。
答案 1 :(得分:4)
您还可以读取8个随机字节,并转换为uint64
b := make([]byte, 8)
_, err := rand.Read(b)
return binary.LittleEndian.Uint64(b), err
答案 2 :(得分:1)
您可以直接致电rand.Uint64()
:
r := rand.Uint64()
Uint64从默认Source中返回伪随机64位值作为uint64。
https://golang.org/pkg/math/rand/#Uint64
这适用于版本1.8
及以上版本:changelog