You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 15:15:32