Jinyun's Notes 🚀

没什么天赋,爱好也不多,但愿坚持做些喜欢的事情

0%

Go 随机数

🥳 在 Go 中的生成的随机数根本就不是随机的,叫伪随机数。它们是用固定的决定论算法计算的。

生成伪随机数

如果初始化时没有调用 rand.Seed 方法,你每次运行程序都会得到相同的数字序列。

使用 math/rand 包中的 rand.Seed 和 rand.Int63 方法去生成 int64 类型的的非负伪随机数:

1
2
rand.Seed(time.Now().UnixNano())
n := rand.Int63() // 4394549077322118751

使用 rand.Float64 生成一个浮点伪随机数 x,其中 0 <= x <= 1:

1
2
rand.Seed(time.Now().UnixNano())
n := rand.Float64() // 0.41473976189141065

math/rand 包中的函数都使用单个随机源:

1
2
3
generator := rand.New(rand.NewSource(time.Now().UnixNano()))
x := generator.Int63() // 1449278222774694185
y := generator.Float64() // 0.947309190343705

生成指定范围随机数

1
2
3
4
// a <= n <= b
a, b := 0, 100
generator := rand.New(rand.NewSource(time.Now().UnixNano()))
n := a + generator.Intn(b-a+1) // 0 <= n <= 100

生成指定范围随机字符

1
2
3
4
5
6
7
8
// 'a' <= n <= 'z'
var (
x = 'a'
y = 'z'
)
generator := rand.New(rand.NewSource(time.Now().UnixNano()))
n := x + rune(generator.Intn(int(y)-int(x)+1)) // 97 <= n <= 122
m := 'a' + rune(generator.Intn('z'-'a'+1)) // 92 <= m <= 122

生成随机字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package main

import (
"fmt"
"math/rand"
"time"
)

func init() {
rand.Seed(time.Now().UnixNano())
}

func main() {
for i := 0; i < 10; i++ {
fmt.Println(randomString(10))
}
}

func randomString(size int) string {
bytes := make([]byte, size)
for i := 0; i < size; i++ {
bytes[i] = byte(randInt(97, 122))
}

return string(bytes)
}

func randInt(min, max int) int {
return min + rand.Intn(max-min+1)
}

/*
tcjrkupnct
twdvwjihfb
lkemigoqne
vqxyasbrqx
iwdncpibxg
ugtsutgmjt
namoonwvyh
mcxnbbjfgf
ufradkxsjq
blnweycudh
*/

从切片中获取随机元素

实例一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main

import (
"fmt"
"math/rand"
"time"
)

func init() {
rand.Seed(time.Now().UnixNano())
}

func main() {
runes := []rune("A™B£C¢")
char := runes[rand.Intn(len(runes))]

fmt.Println(string(char)) // £
}

实例二:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main

import (
"fmt"
"math/rand"
"time"
)

func init() {
rand.Seed(time.Now().UnixNano())
}

func main() {
slices := make([]string, 0)
slices = append(slices, "Apple", "Google", "Microsoft", "Amazon", "Facebook")
element := slices[rand.Intn(len(slices))]

// Get random element from slices: Amazon
fmt.Println(fmt.Sprintf("Get random element from slices: %v", element))
}

生成安全的随机数

1
2
randomCrypto, _ := rand.Prime(rand.Reader, 128)
fmt.Println(randomCrypto) // 332362372159551722027736589221875117617
本笔记是笔者在学习和工作中的一些整理,如对您有用,请鼓励我继续写作