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

huangapple go评论110阅读模式
英文:

Why does math/rand return the same result every time I restart my program?

问题

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

  1. package utils
  2. import (
  3. "fmt"
  4. "math/rand"
  5. )
  6. var chars = []rune("abcdefghijklmnopqrstuvwxyz0123456789")
  7. func RandSeq(n int) string {
  8. b := make([]rune, n)
  9. for i := range b {
  10. b[i] = chars[rand.Intn(len(chars))]
  11. }
  12. fmt.Println(string(b))
  13. return string(b)
  14. }

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

  1. go run main.go
  2. fpllngzieyoh43e0133ols6k1hh2gdny
  3. xxvi7hvszwk1b182tvjzjpezi4hx9gvm
  4. kir0xcta0opsb5qipjzb3h3x9kcegta5
  5. m1zcv5drxckn42gb50anxndsckjdwgfw
  6. 5japz01zicapy9eqixuc9uehq235v48c
  7. 51wgg1gypq4s9miwn1dxkjqd614m58f0
  8. fyy29g6ujmxbouxshy2plmkmhlnmdbfh
  9. f7kq8u26873eql4yyp7fyilbb72nrtlc
  10. go run main.go
  11. fpllngzieyoh43e0133ols6k1hh2gdny
  12. xxvi7hvszwk1b182tvjzjpezi4hx9gvm
  13. kir0xcta0opsb5qipjzb3h3x9kcegta5
  14. m1zcv5drxckn42gb50anxndsckjdwgfw
  15. 5japz01zicapy9eqixuc9uehq235v48c

有任何想法为什么会发生这种情况吗?

英文:

I'm a little confused. I have a random string generator, here's the code:

  1. package utils
  2. import (
  3. "fmt"
  4. "math/rand"
  5. )
  6. var chars = []rune("abcdefghijklmnopqrstuvwxyz0123456789")
  7. func RandSeq(n int) string {
  8. b := make([]rune, n)
  9. for i := range b {
  10. b[i] = chars[rand.Intn(len(chars))]
  11. }
  12. fmt.Println(string(b))
  13. return string(b)
  14. }

Every time I run this, it will generate a new random string, but if I restart the server the results will repeat themselves. Here are some results:

  1. go run main.go
  2. fpllngzieyoh43e0133ols6k1hh2gdny
  3. xxvi7hvszwk1b182tvjzjpezi4hx9gvm
  4. kir0xcta0opsb5qipjzb3h3x9kcegta5
  5. m1zcv5drxckn42gb50anxndsckjdwgfw
  6. 5japz01zicapy9eqixuc9uehq235v48c
  7. 51wgg1gypq4s9miwn1dxkjqd614m58f0
  8. fyy29g6ujmxbouxshy2plmkmhlnmdbfh
  9. f7kq8u26873eql4yyp7fyilbb72nrtlc
  10. go run main.go
  11. fpllngzieyoh43e0133ols6k1hh2gdny
  12. xxvi7hvszwk1b182tvjzjpezi4hx9gvm
  13. kir0xcta0opsb5qipjzb3h3x9kcegta5
  14. m1zcv5drxckn42gb50anxndsckjdwgfw
  15. 5japz01zicapy9eqixuc9uehq235v48c

Any idea why this is happening?

答案1

得分: 8

你需要在生成任何随机数之前,先对随机数生成器进行种子。一个好的值可以使用当前的Unix时间戳:

  1. import (
  2. "math/rand"
  3. "time"
  4. )
  5. func main() {
  6. rand.Seed(time.Now().UnixNano())
  7. }

请注意,你应该只在启动时(或分叉后)对随机数生成器进行一次种子操作,而不是在每次生成随机数之前都进行种子操作。

英文:

You need to Seed the random number generator prior to generating any random numbers. A good value to use is the current unix timestamp:

  1. import (
  2. "math/rand"
  3. "time"
  4. )
  5. func main() {
  6. rand.Seed(time.Now().UnixNano())
  7. }

Note that you should only seed the RNG once at startup (or after forking), not before each random number generation.

答案2

得分: 2

如果未设置rand.Seed,它会将种子默认设置为1,导致每次生成相同的随机数。

在启动时使用一个随机数种子来初始化rand,例如rand.Seed(time.Now().UnixNano()),将使得每次运行程序时都得到不同的结果。

你也可以创建自己的随机变量,例如:

  1. var random = rand.New(rand.NewSource(time.Now().UnixNano()))
  2. func main() {
  3. num := random.Intn(10)
  4. fmt.Println(num)
  5. num = random.Intn(10)
  6. fmt.Println(num)
  7. }
英文:

If rand.Seed is not set, it defaults the seed to 1, giving you the same random number every time.

Seeding rand at startup with a random number like rand.Seed(time.Now().UnixNano()) will give you a changing result each time you run your program.

You can also create your own random var like:

  1. var random = rand.New(rand.NewSource(time.Now().UnixNano()))
  2. func main() {
  3. num := random.Intn(10)
  4. fmt.Println(num)
  5. num = random.Intn(10)
  6. fmt.Println(num)
  7. }

huangapple
  • 本文由 发表于 2014年9月22日 00:37:51
  • 转载请务必保留本文链接:https://go.coder-hub.com/25961425.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定