在 Golang 生成随机数

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

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

随机范围内:生成最大值为上限,最小值为下限的范围内的数字。

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

兰特。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 提供密码和来改变未来数字的随机性水平。它是加密就绪的,使用方便,安全,但速度较慢。它用于生成密钥、CSRF 令牌或任何与安全相关的东西。

例:

package main

import (
    "crypto/rand"
    "fmt"
)

func main() {
    RandomCrypto, _ := rand.Prime(rand.Reader, 128)
    fmt.Println(RandomCrypto)
}

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