rand.Intn 多次生成相同的随机序列

rand.Intn generating same random sequences multiple time

我正在尝试编写一个生成带有字母数字字符的随机序列的函数,不幸的是,该函数 returns 多次调用时生成相同的随机序列。

我什至尝试用 time.Now().UTC().UnixNano() 作为兰特的种子,尽管一次又一次地得到相同的值

主包:

package main

import (
    "fmt"
    "time"

    "userpkg/random"
)

func main() {
    fmt.Println(random.RandomHash(32))
    fmt.Println(random.RandomHash(32))
    fmt.Println(random.RandomHash(32))
    fmt.Println(random.RandomHash(32))
}

随机包

package random

func RandomHash(length int8) string {

        rand.Seed(time.Now().UTC().UnixNano())
    pool := []byte(`0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`)

    /* allocate a new slice array to store the hash */
    buf := make([]byte, length)

    for i := int8(0); i < length; i++ {
        buf[i] = pool[rand.Intn(len(pool))]
    }
    rand.Shuffle(len(buf), func(i, j int) {
        buf[i], buf[j] = buf[j], buf[i]
    })
    str := string(buf)
    return str

}

输出:

Aau9hmA3YpDezPMIFUtgSUoQfwi7KuWK
Aau9hmA3YpDezPMIFUtgSUoQfwi7KuWK
Aau9hmA3YpDezPMIFUtgSUoQfwi7KuWK
Aau9hmA3YpDezPMIFUtgSUoQfwi7KuWK

请指导我如何解决这个问题,谢谢

您只需为 math/rand 包播种一次。如果您“非常快”地调用 RandomHash() 函数,您会将它设置为相同的值,因此它将使用相同的随机值,从而产生相同的结果!最重要的是,在 Go Playground 上,时间是确定性的(它不会流逝,除非调用 time.Sleep()!)。

将种子移到 RandomHash() 之外,例如到包 init() 函数:

func init() {
    rand.Seed(time.Now().UnixNano())
}

func RandomHash(length int8) string {
    // ...
}

然后 RandomHash() 的每个 return 值将(可能)不同,例如(在 Go Playground 上试试):

Aau9hmA3YpDezPMIFUtgSUoQfwi7KuWK
8XhJlp6EAXqqbEcPLQL83pw8wUiJRl7D
HGWpHldhGWpzl2KY10ua15T04N1eoPp7
huRNzf4eD7IIuqYNjoMZB5z6r0RFRB64

另见相关问题:

How to generate a random string of a fixed length in Go?