我正在尝试编写一个生成带有字母数字字符的随机序列的函数,不幸的是,该函数在多次调用时返回相同的随机序列。我什至尝试用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
- 1 回答
- 0 关注
- 160 浏览
添加回答
举报
0/150
提交
取消