go - go语言中的随机整数在每个运行时都是可预测的
问题描述
我正在使用math/rand
包生成随机整数作为临时令牌。问题是随机数在每个运行时都是可预测的(总是相同的序列)。我什Seed()
至在调用之前使用过函数,rand.Intn(100000)
但这些数字也是可以预测的。有没有办法生成真正的随机数Golang
?顺便说一下,这是我的最终代码。
rand.Seed(rand.Intn(500))
fmt.Println(rand.Intn(100000))
解决方案
您可以time.Nanoseconds()
用作播种机。它为您提供了更多的随机性,但正如有效的 go所说,使用math/rand
seeded withtime.Nanoseconds()
只会导致少量熵。作为替代方案,您可以使用 go 正在使用的有效解决方案(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
在任何需要的地方使用函数,并确保生成的数字是伪随机的。
推荐阅读
- kubernetes - Kubernetes 清理过程
- java - java正则表达式捕获字符串中的任意数量的句点
- tfs - On-premises TFS Pipeline licensing
- javascript - how to execute observable in array Angular?
- reactjs - 将带有 react-leaflet 模块的 json 数据加载到 GeoJSON 中不起作用
- snakemake - 有没有办法在 Snakemake 工作流中创建多个报告(每个样本一个)
- python - tkinter - 使用按钮打开文件并将文件名保存到变量
- javascript - 如何有条件地隐藏对象数组中的对象?
- cookies - 如何使用 URLFetchApp 在标头中设置两个 cookie
- excel - 查找位于一个工作表上的各个组的工单数据,并根据组名称移动到另一个工作表