在go的学习使用过程中,有这样的一个例子
package main
import (
"fmt"
"math/rand"
)
func main() {
fmt.Println("My favorite number is", rand.Intn(10))
}
运行之后的结果为:
My favorite number is 1
并且你再次运行不管怎么运行结果都是这样不变,这奇了怪了,rand不是代表随机数么,怎么就不随机了呢,下面的解释是:
程序运行的环境是固定的,因此rand.Intn总是会返回相同的数字,这个不懂,难道编译之后这个就固定了,不会变化了么,后来搜索了下,说这个rand类似于c的rand,是个伪随机数,初始化了不会变了。 哎,那我们继续看,rand.Seed这个东西
Seed使用提供的值将默认Source初始化为确定性状态。
如果未调用Seed,则生成器的行为就像由Seed(1)设置一样。
除以2 ^ 31-1时具有相同余数的值会生成相同的伪随机序列。
与Rand.Seed方法不同,可以安全地同时使用。
大概意思是,seed会将source初始化为确定性状态,设置的值相同,则会有相同的伪随机序列。我们试试使用seed
import (
"fmt"
"math/rand"
)
func main() {
rand.Seed(1)
fmt.Println("My favorite number is", rand.Intn(10))
}
然后运行多次,结果依然
My favorite number is 1
所以到底要怎么搞,那seed如果设置的每次都不一致,那是不是随机的就不一样了,这个时候想起了go的获取时间函数,试一下:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
nowtime := time.Now().Unix()
rand.Seed(nowtime)
fmt.Println("My favorite number is", rand.Intn(10))
}
第一次运行:
My favorite number is 7
第二次运行:
My favorite number is 8
可以看到两次的运行结果不一致了。 这个随机的操作真的让人难受,要弄个随机的值还得使用seed一起。难道这就是类c函数的魅力么。c语言都忘光了。只有继续好好学下go了。