golang rand.Int()。为什么每次都是相同的值?

rzl*_*vmp -1 random go

我有一个代码:

package main

import ("fmt"
    "math/rand"
    "strconv"
)

func main() {
    fmt.Println(strconv.Itoa(rand.Int()))
    fmt.Println(strconv.Itoa(rand.Int()))
    fmt.Println(strconv.Itoa(rand.Int()))
    fmt.Println(strconv.Itoa(rand.Int()))
    fmt.Println(strconv.Itoa(rand.Int()))
    fmt.Println(strconv.Itoa(rand.Int()))
    fmt.Println(strconv.Itoa(rand.Int()))
    fmt.Println(strconv.Itoa(rand.Int()))
    fmt.Println(strconv.Itoa(rand.Int()))
    fmt.Println(strconv.Itoa(rand.Int()))
    fmt.Println(strconv.Itoa(rand.Int()))
    fmt.Println(strconv.Itoa(rand.Int()))
    fmt.Println(strconv.Itoa(rand.Int()))
    fmt.Println(strconv.Itoa(rand.Int()))
}
Run Code Online (Sandbox Code Playgroud)

当我运行它 ( go run code.go) 时,我每次都会得到相同的值:

5577006791947779410
8674665223082153551
6129484611666145821
4037200794235010051
3916589616287113937
6334824724549167320
605394647632969758
1443635317331776148
894385949183117216
2775422040480279449
4751997750760398084
7504504064263669287
1976235410884491574
3510942875414458836
Run Code Online (Sandbox Code Playgroud)

第二次尝试:

package main

import ("fmt"
        "math/rand"
        "strconv"
)

func main() {
    fmt.Println(strconv.Itoa(rand.Intn(100)))
    fmt.Println(strconv.Itoa(rand.Intn(100)))
    fmt.Println(strconv.Itoa(rand.Intn(100)))
    fmt.Println(strconv.Itoa(rand.Intn(100)))
    fmt.Println(strconv.Itoa(rand.Intn(100)))
    fmt.Println(strconv.Itoa(rand.Intn(100)))
    fmt.Println(strconv.Itoa(rand.Intn(100)))
}
Run Code Online (Sandbox Code Playgroud)

同样的行为。每次的

81
87
47
59
81
18
25
Run Code Online (Sandbox Code Playgroud)

你在开玩笑吗?为什么会发生?这里不描述非随机相同的结果。我只能看到pseudo-random 术语而没有解释这意味着什么。

看起来即使是 bash 也更合乎逻辑和稳定......

这是C方式

随机的

dav*_*ave 10

你需要播种。它在文档中说得对

随机数由源生成。诸如 Float64 和 Int 之类的顶级函数使用默认的共享源,该源在每次程序运行时生成确定性的值序列。如果每次运行需要不同的行为,请使用 Seed 函数来初始化默认 Source。

一般来说

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


wim*_*wim 6

Seed在使用生成器之前,您似乎没有要求数学/兰德。

如果Seed未调用,则生成器的行为就像由 播种一样Seed(1)。这不是一个笑话——实际上,在许多情况下,PRNG 具有确定性和可重复性是可取的。

对于不同的数字,使用不同值的种子,例如time.Now().UnixNano()