跳到主要内容

rand

math/rand

"math/rand" 包实现了伪随机数生成器。也就是生成整形和浮点型。

该包中根据生成伪随机数是是否有种子(可以理解为初始化伪随机数),可以分为两类:

  1. 有种子。通常以时钟,输入输出等特殊节点作为参数初始化;该类型生成的随机数相比无种子时重复概率较低。
  2. 无种子。可以理解为此时种子为 1, Seek(1)
import (
"fmt"
"math/rand"
"time"
)

func main() {
for i := 0; i < 10; i++ {
r := rand.New(rand.NewSource(time.Now().UnixNano()))
fmt.Printf("%d ", r.Int31())
}

fmt.Println("")
for i := 0; i < 10; i++ {
fmt.Printf("%d ", rand.Int31())
}
}
// 1278610617 1508223627 2035989429 921556381 1472325922 1058000409 246974909 2131355695 160634752 1895791427
// 1298498081 2019727887 1427131847 939984059 911902081 1474941318 140954425 336122540 208240456 646203300

示例

package main

import (
"fmt"
"math/rand"
"os"
"text/tabwriter"
)

func main() {
// Create and seed the generator.
// Typically a non-fixed seed should be used, such as time.Now().UnixNano().
// Using a fixed seed will produce the same output on every run.
r := rand.New(rand.NewSource(99))

// The tabwriter here helps us generate aligned output.
w := tabwriter.NewWriter(os.Stdout, 1, 1, 1, ' ', 0)
defer w.Flush()
show := func(name string, v1, v2, v3 interface{}) {
fmt.Fprintf(w, "%s\t%v\t%v\t%v\n", name, v1, v2, v3)
}

// Float32 and Float64 values are in [0, 1).
show("Float32", r.Float32(), r.Float32(), r.Float32())
show("Float64", r.Float64(), r.Float64(), r.Float64())

// ExpFloat64 values have an average of 1 but decay exponentially.
show("ExpFloat64", r.ExpFloat64(), r.ExpFloat64(), r.ExpFloat64())

// NormFloat64 values have an average of 0 and a standard deviation of 1.
show("NormFloat64", r.NormFloat64(), r.NormFloat64(), r.NormFloat64())

// Int31, Int63, and Uint32 generate values of the given width.
// The Int method (not shown) is like either Int31 or Int63
// depending on the size of 'int'.
show("Int31", r.Int31(), r.Int31(), r.Int31())
show("Int63", r.Int63(), r.Int63(), r.Int63())
show("Uint32", r.Uint32(), r.Uint32(), r.Uint32())

// Intn, Int31n, and Int63n limit their output to be < n.
// They do so more carefully than using r.Int()%n.
show("Intn(10)", r.Intn(10), r.Intn(10), r.Intn(10))
show("Int31n(10)", r.Int31n(10), r.Int31n(10), r.Int31n(10))
show("Int63n(10)", r.Int63n(10), r.Int63n(10), r.Int63n(10))

// Perm generates a random permutation of the numbers [0, n).
show("Perm", r.Perm(5), r.Perm(5), r.Perm(5))
}
Output:

Float32 0.2635776 0.6358173 0.6718283
Float64 0.628605430454327 0.4504798828572669 0.9562755949377957
ExpFloat64 0.3362240648200941 1.4256072328483647 0.24354758816173044
NormFloat64 0.17233959114940064 1.577014951434847 0.04259129641113857
Int31 1501292890 1486668269 182840835
Int63 3546343826724305832 5724354148158589552 5239846799706671610
Uint32 2760229429 296659907 1922395059
Intn(10) 1 2 5
Int31n(10) 4 7 8
Int63n(10) 7 6 3
Perm [1 4 2 3 0] [4 2 1 3 0] [1 2 4 0 3]