在线文档  >   Golang练习   >   随机数

Go的math/rand包提供了伪随机数产生。

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {

    //例如, `rand.Intn`返回一个随机整数n, `0 <= n < 100`。
    // 随机生成0-99之间的整数,输出并跟上一个逗号
    fmt.Print(rand.Intn(100), ",")
    // 随机生成0-99之间的整数并输出
    fmt.Print(rand.Intn(100))
    fmt.Println()

    // `rand.Float64`返回一个`float64`类型的浮点数`f`, `0.0 <= f < 1.0`。
    // 随机生成0.0-1.0之间的浮点数并输出
    fmt.Println(rand.Float64())

    // 这可以用于生成其他范围内的随机浮点数,例如 `5.0 <= f' < 10.0`。
    // 随机生成5.0-10.0之间的浮点数并输出,跟上逗号
    fmt.Print((rand.Float64()*5)+5, ",")
    // 随机生成5.0-10.0之间的浮点数并输出
    fmt.Print((rand.Float64() * 5) + 5)
    fmt.Println()

    // 默认的随机数生成器是确定性的,因此默认情况下它会产生相同的数字序列。
    // 为了产生不同的序列,请给它一个不同的种子。
    // 请注意,对于打算加密的随机数,请使用`crypto/rand`。
    // 使用当前时间作为种子创建新的源
    s1 := rand.NewSource(time.Now().UnixNano())
    // 使用新的源创建一个新的Rand对象
    r1 := rand.New(s1)

    // 调用结果为`rand.Rand`的函数就像在`rand` 包上一样。
    // 随机生成0-99之间的整数,并输出跟上逗号
    fmt.Print(r1.Intn(100), ",")
    fmt.Print(r1.Intn(100))
    fmt.Println()

    // 如果你用相同的数字来种子一个源,它将产生相同的一系列随机数字。
    // 使用42作为种子创建新的源
    s2 := rand.NewSource(42)
    r2 := rand.New(s2)
    fmt.Print(r2.Intn(100), ",")
    fmt.Print(r2.Intn(100))
    fmt.Println()
    s3 := rand.NewSource(42)
    // 使用新的源创建一个新的Rand对象
    r3 := rand.New(s3)
    fmt.Print(r3.Intn(100), ",")
    fmt.Print(r3.Intn(100))
}

运行结果如下:

$ go run random-numbers.go
81,87
0.6645600532184904
7.123187485356329,8.434115364335547
0,28
5,87
5,87

根据运行此示例的位置,生成的某些数字可能会有所不同。请注意,在 Go playground seeding 与time.Now()由于操场的实现方式,仍然会产生确定性的结果。

请参阅 ‘math/rand’ 包文档,了解 Go 可以提供的其他随机量的参考。