为什么每次重新启动程序时 math/rand 都会返回相同的结果?

我有点困惑。我有一个随机字符串生成器,这是代码:


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)

}

每次我运行它时,它都会生成一个新的随机字符串,但如果我重新启动服务器,结果会重复。以下是一些结果:


go run main.go

fpllngzieyoh43e0133ols6k1hh2gdny

xxvi7hvszwk1b182tvjzjpezi4hx9gvm

kir0xcta0opsb5qipjzb3h3x9kcegta5

m1zcv5drxckn42gb50anxndsckjdwgfw

5japz01zicapy9eqixuc9uehq235v48c

51wgg1gypq4s9miwn1dxkjqd614m58f0

fyy29g6ujmxbouxshy2plmkmhlnmdbfh

f7kq8u26873eql4yyp7fyilbb72nrtlc


go run main.go

fpllngzieyoh43e0133ols6k1hh2gdny

xxvi7hvszwk1b182tvjzjpezi4hx9gvm

kir0xcta0opsb5qipjzb3h3x9kcegta5

m1zcv5drxckn42gb50anxndsckjdwgfw

5japz01zicapy9eqixuc9uehq235v48c

知道为什么会这样吗?


米脂
浏览 279回答 2
2回答

互换的青春

在生成任何随机数之前,您需要为随机数生成器设置种子。一个很好的使用价值是当前的 unix 时间戳:import (    "math/rand"    "time")func main() {    rand.Seed(time.Now().UnixNano())}请注意,您应该只在启动时(或分叉后)为 RNG 播种一次,而不是在每次生成随机数之前。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go