在 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
|