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)
}
当您执行此代码时,每次都会得到不同的输出。