目录

Go 随机数

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

生成伪随机数

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

使用 math/rand 包中的 rand.Seedrand.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