go中的rand.Int() 为什么每次返回的都是同一个值,并不是随机?

比如下面的代码:
package main

import "math/rand"

func GenRandom() chan int {
ch := make(chan int, 10)
go func() {
for {
ch <- rand.Int()
}
}()

return ch
}
func main() {
ch := GenRandom()
println(<-ch)
println("end of main")

}

返回的永远都是
5577006791947779410
 
原因是每次没有调用rand.Seed(xxxx), 导致随机种子都是 1 。 见官方文档
Seed uses the provided seed value to initialize the default Source to a deterministic state. If Seed is not called, the generator behaves as if seeded by Seed(1).

  
所以如果想要每次随机值不一样
需要用时间戳作为随机种子
 
func GenRandom() chan int {
ch := make(chan int, 10)
go func() {
rand.Seed(time.Now().Unix())
for {
ch <- rand.Intn(200)
}
}()

return ch
}

0 个评论

要回复文章请先登录注册