在go的学习使用过程中,有这样的一个例子

    1. package main
    2. import (
    3. "fmt"
    4. "math/rand"
    5. )
    6. func main() {
    7. fmt.Println("My favorite number is", rand.Intn(10))
    8. }

    运行之后的结果为:

    1. My favorite number is 1

    并且你再次运行不管怎么运行结果都是这样不变,这奇了怪了,rand不是代表随机数么,怎么就不随机了呢,下面的解释是:
    image.png
    程序运行的环境是固定的,因此rand.Intn总是会返回相同的数字,这个不懂,难道编译之后这个就固定了,不会变化了么,后来搜索了下,说这个rand类似于c的rand,是个伪随机数,初始化了不会变了。 哎,那我们继续看,rand.Seed这个东西
    image.png

    1. Seed使用提供的值将默认Source初始化为确定性状态。
    2. 如果未调用Seed,则生成器的行为就像由Seed1)设置一样。
    3. 除以2 ^ 31-1时具有相同余数的值会生成相同的伪随机序列。
    4. Rand.Seed方法不同,可以安全地同时使用。

    大概意思是,seed会将source初始化为确定性状态,设置的值相同,则会有相同的伪随机序列。我们试试使用seed

    1. import (
    2. "fmt"
    3. "math/rand"
    4. )
    5. func main() {
    6. rand.Seed(1)
    7. fmt.Println("My favorite number is", rand.Intn(10))
    8. }

    然后运行多次,结果依然

    1. My favorite number is 1

    所以到底要怎么搞,那seed如果设置的每次都不一致,那是不是随机的就不一样了,这个时候想起了go的获取时间函数,试一下:

    1. package main
    2. import (
    3. "fmt"
    4. "math/rand"
    5. "time"
    6. )
    7. func main() {
    8. nowtime := time.Now().Unix()
    9. rand.Seed(nowtime)
    10. fmt.Println("My favorite number is", rand.Intn(10))
    11. }

    第一次运行:

    1. My favorite number is 7

    第二次运行:

    1. My favorite number is 8

    可以看到两次的运行结果不一致了。 这个随机的操作真的让人难受,要弄个随机的值还得使用seed一起。难道这就是类c函数的魅力么。c语言都忘光了。只有继续好好学下go了。