为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
四季花海 2022-07-04 16:52:43
我正在尝试编写一个生成带有字母数字字符的随机序列的函数,不幸的是,该函数在多次调用时返回相同的随机序列。我什至尝试用time.Now().UTC().UnixNano()播种 rand ,即使一次又一次获得相同的值主要包装:package mainimport (    "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 randomfunc 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}输出 :Aau9hmA3YpDezPMIFUtgSUoQfwi7KuWKAau9hmA3YpDezPMIFUtgSUoQfwi7KuWKAau9hmA3YpDezPMIFUtgSUoQfwi7KuWKAau9hmA3YpDezPMIFUtgSUoQfwi7KuWK请指导我如何解决这个问题,谢谢
查看完整描述

1 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

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


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


func init() {

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

}


func RandomHash(length int8) string {

    // ...

}

然后(可能)的每个返回值RandomHash()都会不同,例如(在Go Playground上尝试):


Aau9hmA3YpDezPMIFUtgSUoQfwi7KuWK

8XhJlp6EAXqqbEcPLQL83pw8wUiJRl7D

HGWpHldhGWpzl2KY10ua15T04N1eoPp7

huRNzf4eD7IIuqYNjoMZB5z6r0RFRB64


查看完整回答
反对 回复 2022-07-04
  • 1 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信