首页 > 解决方案 > go语言中的随机整数在每个运行时都是可预测的

问题描述

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

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

标签: gorandominteger

解决方案


您可以time.Nanoseconds()用作播种机。它为您提供了更多的随机性,但正如有效的 go所说,使用math/randseeded 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在任何需要的地方使用函数,并确保生成的数字是伪随机的。


推荐阅读