我有点困惑.我有一个随机字符串生成器,这里是代码:
package utils
import (
"fmt"
"math/rand"
)
var chars = []rune("abcdefghijklmnopqrstuvwxyz0123456789")
func RandSeq(n int) string {
b := make([]rune, n)
for i := range b {
b[i] = chars[rand.Intn(len(chars))]
}
fmt.Println(string(b))
return string(b)
}
Run Code Online (Sandbox Code Playgroud)
每次运行时,它都会生成一个新的随机字符串,但是如果我重新启动服务器,结果会重复.以下是一些结果:
go run main.go
fpllngzieyoh43e0133ols6k1hh2gdny
xxvi7hvszwk1b182tvjzjpezi4hx9gvm
kir0xcta0opsb5qipjzb3h3x9kcegta5
m1zcv5drxckn42gb50anxndsckjdwgfw
5japz01zicapy9eqixuc9uehq235v48c
51wgg1gypq4s9miwn1dxkjqd614m58f0
fyy29g6ujmxbouxshy2plmkmhlnmdbfh
f7kq8u26873eql4yyp7fyilbb72nrtlc
go run main.go
fpllngzieyoh43e0133ols6k1hh2gdny
xxvi7hvszwk1b182tvjzjpezi4hx9gvm
kir0xcta0opsb5qipjzb3h3x9kcegta5
m1zcv5drxckn42gb50anxndsckjdwgfw
5japz01zicapy9eqixuc9uehq235v48c
Run Code Online (Sandbox Code Playgroud)
知道为什么会这样吗?
您需要在生成任意随机数之前对随机数生成器进行种子处理.一个好的值是当前的unix时间戳:
import (
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
}
Run Code Online (Sandbox Code Playgroud)
请注意,您应该只在启动时(或分叉后)对RNG进行一次播种,而不是在每个随机数生成之前播种.