乐趣区

关于go:go-rand-创建-伪随机数

一、介绍
让咱们用 Go 语言创立一个伪随机数。
这是一个简略的代码:
从 0 到 9 的数字输入 10 次。

func TestRandIntn(t *testing.T) {rand.Seed(time.Now().UnixNano())
    for i := 0; i < 10; i++ {fmt.Println("number is", rand.Intn(10))
    }
}

输入:

number is  7
number is  1
number is  6
number is  1
number is  8
number is  7
number is  3
number is  4
number is  9
number is  9

要害是在名为 rand.Seed(time.Now().UnixNano())的中央给出作为随机数起源的种子。
给个种子的起因是这里应用的函数 rand.Intn 在 rand 包中生成新的随机数生成器的时候如同初始化 rand.NewSource(1)一样,所以给个种子,如同是须要收回不同的随机数。

上面是一个没有收获的具备雷同后果的示例。


func TestRandIntnNoSeed(t *testing.T) {
    // 无种子 rand.Intn 随机
    for i := 0; i < 10; i++ {fmt.Print(rand.Intn(10), " ")
    }
    fmt.Println(" ")

    // rand.NewSource 初始化 rand 并执行
    myRand := rand.New(rand.NewSource(1))
    for i := 0; i < 10; i++ {fmt.Print(myRand.Intn(10), " ")
    }
    fmt.Println(" ")

    // 增加种子在 rand
    myRand.Seed(time.Now().UnixNano())
    for i := 0; i < 10; i++ {fmt.Print(myRand.Intn(10), " ")
    }
}

第一次运行

=== RUN   TestRandIntnNoSeed
1 7 7 9 1 8 5 0 6 0  
1 7 7 9 1 8 5 0 6 0  
7 6 9 1 4 2 1 5 3 1 --- PASS: TestRandIntnNoSeed (0.00s)
PASS

第二次运行

=== RUN   TestRandIntnNoSeed
1 7 7 9 1 8 5 0 6 0  
1 7 7 9 1 8 5 0 6 0  
3 9 3 8 6 6 2 5 2 6 --- PASS: TestRandIntnNoSeed (0.00s)
PASS
退出移动版