Go语言随机密码生成问题:循环生成重复密码求解
问题原因与解决方案
问题根源
你遇到的问题是因为每次调用random()函数时都重复初始化了随机数种子:
rand.Seed(time.Now().UnixNano())会根据当前时间的纳秒数设置随机数生成器的初始值- 循环执行速度极快,10次调用几乎在同一纳秒内完成,导致每次的种子值完全相同
- 相同的种子会让
rand包生成完全一致的随机序列,所以每次输出的密码都一模一样
修复方案
只需要在程序启动时初始化一次随机数种子,不要在每次生成密码时重复设置。修改后的代码如下:
import ( "fmt" "math/rand" "strings" "time" ) func main() { // 仅初始化一次随机数种子 rand.Seed(time.Now().UnixNano()) for i := 0; i < 10; i++ { a := random() fmt.Println(a) } } func random() string { chars := []rune("abcdefghijklmnopqrstuvwxyz" + "0123456789") length := 10 var b strings.Builder for i := 0; i < length; i++ { b.WriteRune(chars[rand.Intn(len(chars))]) } return b.String() }
额外提示
如果使用Go 1.20及以上版本,甚至可以省略手动调用rand.Seed()——标准库会自动在程序启动时基于系统熵初始化随机种子,代码可以进一步简化。
内容的提问来源于stack exchange,提问作者Vlad Tkachev
相关产品推荐
相关产品推荐

