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

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


我什至尝试用time.Now().UTC().UnixNano()播种 rand ,即使一次又一次获得相同的值


主要包装:


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

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


四季花海
浏览 162回答 1
1回答

MYYA

您只需为math/rand包播种一次。如果您RandomHash()“非常快”地调用该函数,您会将其播种为相同的值,因此它将使用相同的随机值,从而产生相同的结果!time.Sleep()最重要的是,在 Go Playground 上,时间是确定性的(除非调用eg,否则它不会过去!)。将播种移到 之外RandomHash(),例如到一个包init()函数:func init() {&nbsp; &nbsp; rand.Seed(time.Now().UnixNano())}func RandomHash(length int8) string {&nbsp; &nbsp; // ...}然后(可能)的每个返回值RandomHash()都会不同,例如(在Go Playground上尝试):Aau9hmA3YpDezPMIFUtgSUoQfwi7KuWK8XhJlp6EAXqqbEcPLQL83pw8wUiJRl7DHGWpHldhGWpzl2KY10ua15T04N1eoPp7huRNzf4eD7IIuqYNjoMZB5z6r0RFRB64
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go