难以使用Go兰德 Package

qyzbxkaa  于 2023-01-22  发布在  Go
关注(0)|答案(4)|浏览(134)

有没有Go语言的函数每次运行都返回真伪随机数?我的意思是,考虑下面的代码,

package main

import (
    "fmt"
    "rand"
)

func main() {
    fmt.Println(rand.Int31n(100))
}

每次我执行这段代码,我得到相同的输出。是否有一个方法每次被调用时都会返回不同的、随机的结果?

exdqitrt

exdqitrt1#

rand可用于生成伪随机数,这些伪随机数基于特定的初始值(称为“种子”)生成。
一个流行的初始种子选择是当前时间(纳秒)--当你多次执行程序时,这个值可能会不同。你可以用当前时间初始化随机数生成器,如下所示:

rand.Seed(time.Now().UnixNano())

(don'不要忘记为此导入time包)
还有另一个名为crypto/rand的包,可用于生成更好的随机值(此生成器还可能考虑用户的鼠标移动、处理器的当前热量和许多其他因素)。但是,此包中的函数要慢几倍,除非您不编写密码短语生成器(或其他安全相关的东西),正常的兰德包可能没问题。

nnt7mjpx

nnt7mjpx2#

您必须首先接种RNG。
我从来没用过围棋,但可能是rand.Seed(x);

insrf1ej

insrf1ej3#

rand.Seed(time.Now().UnixNano())在Ubuntu上工作。我花了很长时间研究rand.Seed(time.Nanoseconds())。我终于找到了这个例子:谷歌搜索2.1在戈兰旅游。

5ktev3wc

5ktev3wc4#

总结以上答案,你可以用rand.Seed(n)编写自己的随机数生成器。每次播种时n必须是不同的数字。下面是一个例子:

func RandomInt(n int) int {
    rand.Seed(time.Now().UnixNano())
    return rand.Intn(n)
}

func RandomIntFromRange(min int, max int) int {
    rand.Seed(time.Now().UnixNano())
    return rand.Intn(max - min + 1) + min
}

相关问题