【问题标题】:rand.Intn generating same random sequences multiple time [duplicate]rand.Intn 多次生成相同的随机序列
【发布时间】:2020-09-30 19:09:25
【问题描述】:

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

我什至尝试用 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

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

【问题讨论】:

    标签: go random-seed


    【解决方案1】:

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

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

    func init() {
        rand.Seed(time.Now().UnixNano())
    }
    
    func RandomHash(length int8) string {
        // ...
    }
    

    那么RandomHash() 的每个返回值将(可能)不同,例如(试试Go Playground):

    Aau9hmA3YpDezPMIFUtgSUoQfwi7KuWK
    8XhJlp6EAXqqbEcPLQL83pw8wUiJRl7D
    HGWpHldhGWpzl2KY10ua15T04N1eoPp7
    huRNzf4eD7IIuqYNjoMZB5z6r0RFRB64
    

    另见相关问题:

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

    【讨论】:

    • @MuraliKrishnaBellamkonda,还请注意,如果您需要更严格意义上的随机性,则需要crypto/rand,因为math/randPRNG,它实际上具有生成相同的属性给定相同种子的伪随机数序列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多