Go的math/random库缺少生成64位数字的功能。大约四年来这是一个未解决的问题。同时,解决方法是什么样的?
math/random
最简单的方法是拨打rand.Uint32()两次:
rand.Uint32()
func Uint64() uint64 { return uint64(rand.Uint32())<<32 + uint64(rand.Uint32()) }
另一个选择是调用rand.Read()(在Go 1.7中添加了)以读取8个字节,然后使用该encoding/binary包从中获取uint64值:
rand.Read()
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错误,因此在这种情况下无需检查错误。
nil
注意#2:您也可以使用binary.BigEndian代替binary.LittleEndian,因为我们正在使用其所有字节生成一个随机数,所以字节顺序是完全不相关的。
binary.BigEndian
binary.LittleEndian