📜  在 Golang 中生成随机数

📅  最后修改于: 2021-10-25 02:34:12             🧑  作者: Mango

Golang 提供了一个包 math/rand 来生成伪随机数。这个包基本上使用一个单一的源,每次执行程序时都会产生一个确定性的值序列。在这里,如果每次执行需要不同的输出或结果,您可以使用种子函数来初始化默认源,这对于多个 goroutine 并发使用是安全的。它在 0 和 n 的区间内生成一个整数。它只需要一个参数,即 n 或上限,如果参数小于零,则抛出错误。

RandomInteger := rand.Int()  // generates a random integer

RandomIntegerwithinRange:生成范围内的数字,其中最大值为上限,最小值为下限。

RandomIntegerwithinRange := rand.Intn(max-min) + min    // range is min to max

rand.Float64():生成0.0到1.0之间的浮点数,使用起来和rand.Int一样简单。

RandomFloatingNumber := rand.Float64() // generates a random floating point number 

例子:

// Generating Random Numbers in Golang
package main
  
import (
    "fmt"
    "math/rand"
    "time"
)
  
func main() {
  
    // Intn returns, as an
    // int, a non-negative
    // pseudo-random number in
    // [0,n) from the default Source.
    // i.e. simply call Intn to
    // get the next random integer.
    fmt.Println(rand.Intn(200))
    fmt.Println(rand.Intn(200))
    fmt.Println(rand.Intn(200))
    fmt.Println()
  
    // Float64 returns, as
    // a float64, a pseudo-random
    // number in [0.0,1.0)
    // from the default Source.
    fmt.Println(rand.Float64())
  
    // By default, it uses the value 1.
    fmt.Println((rand.Float64() * 8) + 7)
    fmt.Println((rand.Float64() * 8) + 7)
    fmt.Println()
  
    // Seeding - Go provides a method,
    // Seed(see int64), that allows you
    // to initialize this default sequence.
      
    // Implementation is slow
    // to make it faster
    // rand.Seed(time.Now().UnixNano())
    // is added. Seed is the current time,
    // converted to int64 by UnixNano.
    // Gives constantly changing numbers
    x1 := rand.NewSource(time.Now().UnixNano())
    y1 := rand.New(x1)
      
    fmt.Println(y1.Intn(200))
    fmt.Println(y1.Intn(200))
    fmt.Println()
  
    x2 := rand.NewSource(55)
    y2 := rand.New(x2)
    fmt.Println(y2.Intn(200))
    fmt.Println(y2.Intn(200))
    fmt.Println()
      
    x3 := rand.NewSource(5)
    y3 := rand.New(x3)
    fmt.Println(y3.Intn(200))
    fmt.Println(y3.Intn(200))
}

输出:

81
87
47

0.4377141871869802
10.397099976570125
12.494584582936875

0
128

112
164

26
36

如果用户想对随机数保密,上述方法是不安全的。这就是为什么 Golang 提供Crypto rand来改变未来数字的随机性水平。它是加密准备使用和安全的,但速度较慢。它用于生成密钥、CSRF 令牌或任何与安全相关的东西。

例子:

package main
  
import (
    "crypto/rand"
    "fmt"
)
  
func main() {
    RandomCrypto, _ := rand.Prime(rand.Reader, 128)
    fmt.Println(RandomCrypto)
}

当您执行此代码时,每次都会得到不同的输出。