gpt4 book ai didi

go - Go语言中的随机整数在每个运行时都是可预测的

转载 作者:行者123 更新时间:2023-12-01 22:11:05 24 4
gpt4 key购买 nike

我正在使用math/rand包来生成随机整数作为临时 token 。问题在于随机数在每个运行时都是可预测的(总是相同的序列)。在调用Seed()之前,我什至使用过rand.Intn(100000)函数,但是这些数字也是可以预测的。
有没有一种方法可以在Golang中生成真正的随机数?顺便说一下,这是我的最终代码。

rand.Seed(rand.Intn(500))
fmt.Println(rand.Intn(100000))

最佳答案

您可以使用time.Nanoseconds()作为播种器。它为您提供了更多的随机性,但正如effective go所述,使用以math/rand播种的time.Nanoseconds()只会产生少量的熵。
或者,您可以使用有效的解决方案(crypto/rand程序包),但这是伪随机的另一解决方案。

import (
crand "crypto/rand"
"math/rand"
)

type cryptSrc struct{}

func (s cryptSrc) Seed(seed int64) {}

func (s cryptSrc) Int63() int64 {
return int64(s.Uint64() & ^uint64(1<<63))
}

func (s cryptSrc) Uint64() (v uint64) {
err := binary.Read(crand.Reader, binary.BigEndian, &v)
if err != nil {
log.Fatal(err)
}
return v
}

// Generate a truly random number
func RandomInt64(i int64) int64 {
var src cryptSrc
rnd := rand.New(src)
return rnd.Int63n(i)
}

您可以在任何需要的地方使用 RandomInt64函数,并确保生成的数字是伪随机数。

关于go - Go语言中的随机整数在每个运行时都是可预测的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63655205/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com