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?
我正在尝试编写一个生成带有字母数字字符的随机序列的函数,不幸的是,该函数 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?