登录
首页 >  Golang >  Go问答

Go语言中的随机数生成具有确定性

来源:stackoverflow

时间:2024-02-18 23:42:17 120浏览 收藏

哈喽!大家好,很高兴又见面了,我是golang学习网的一名作者,今天由我给大家带来一篇《Go语言中的随机数生成具有确定性》,本文主要会讲到等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面就一起来看看吧!

问题内容

我正在使用 math/rand 包生成随机整数作为临时令牌。问题是随机数在每个运行时都是可预测的(始终相同的序列)。我什至在调用 rand.intn(100000) 之前使用了 seed() 函数,但这些数字也是可以预测的。 有没有办法在 golang 中生成真正的随机数?顺便说一句,这是我的最终代码。

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

解决方案


您可以使用 time.nanoseconds() 作为播种器。它为您提供了更多的随机性,但正如 effective go 所说,使用 time.nanoseconds() 种子的 math/rand 只会导致一些熵。 作为替代方案,您可以使用有效的解决方案(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语言中的随机数生成具有确定性》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>