去rand.Intn相同的数字/值

app*_*mes 16 random go

任何人都可以告诉我为什么这里的Go示例:

https://tour.golang.org/basics/1

总是为rand.Intn(10)返回相同的值?

icz*_*cza 31

原因2:

  1. 您必须Source使用包的全局使用rand.Intn()和其他功能.例如:randrand.Seed()

    rand.Seed(time.Now().UnixNano())
    
    Run Code Online (Sandbox Code Playgroud)

    查看可能与Go Rand包一起使用的难度重复.
    引用包文档rand:

    顶级函数(如Float64和Int)使用默认的共享源,每次运行程序时都会生成确定的值序列.如果每次运行需要不同的行为,请使用Seed函数初始化默认Source.

  2. 在巡回赛上运行的例子去游乐场,它可以缓存其输出.
    详细信息请参阅为什么count ++(而不是count = count + 1)会改变Golang中返回地图的方式.


QVS*_*VSJ 5

要使 rand 包中的函数正常工作,您必须设置一个“种子”值。这必须是用户决定的一个很好的随机值,因为 - 根据https://golang.org/pkg/math/rand/#Rand.Seed这是 golang 用来首先将系统设置为确定性状态的值然后根据该值生成一个数字。

要使示例代码正常工作,您可以尝试

func main() {
    rand.Seed(time.Now().UnixNano())
    fmt.Println("My favorite number is ", rand.Intn(10))
}
Run Code Online (Sandbox Code Playgroud)

time.Now().UnixNano 可以给出任意(类似)的数字,因为该值以“千分之一秒”为单位