如何在 Go 中生成随机 uint64?

问题描述 投票:0回答:4

Go 的

math/random
库缺少生成 64 位数字的函数。大约四年来,这个问题一直是“一个悬而未决的问题”。与此同时,解决方法是什么样的?

random go
4个回答
14
投票
编辑:

Go 1.8 添加了 rand.Uint64()

 函数和 
Rand.Uint64()
 方法,所以你可以直接使用它们。
其余答案早于 Go 1.8。

最简单的方法是拨打

rand.Uint32()

 两次:
func Uint64() uint64 { return uint64(rand.Uint32())<<32 + uint64(rand.Uint32()) }

另一种选择是调用 

rand.Read()

在 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
,因为我们使用其所有字节生成随机数,字节顺序完全无关。
    


4
投票
rand.Uint64()


r := rand.Uint64()

Uint64 从默认 Source 返回一个伪随机 64 位值作为 uint64。

https://golang.org/pkg/math/rand/#Uint64

这在

1.8

及更高版本中可用:

changelog


3
投票

b := make([]byte, 8) _, err := rand.Read(b) return binary.LittleEndian.Uint64(b), err



0
投票
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()

}

© www.soinside.com 2019 - 2024. All rights reserved.