...

パッケージ rand

import "math/rand"
概要
目次

概要 ▾

rand パッケージは,擬似乱数生成器を実装します。

乱数は Source によって生成されます。 Float64 や Int などの最上位関数は,プログラムが実行されるたびに確定的な値のシーケンスを生成する,デフォルトの共有 Source を使用します。 実行ごとに異なる動作が必要な場合は, Seed 関数を使用してデフォルトの Source を初期化します。 デフォルトの Source は複数のゴルーチンによる平行使用に対して安全ですが, NewSource によって作成された Source はそうではありません。

このパッケージのドキュメントでは, [0, n) などの数学的な範囲表記を使用しています。

セキュリティを重視する作業に適した乱数については, crypto/rand パッケージを参照してください。

コード:

// 同じ値でシードすると,実行ごとに同じランダムシーケンスが生成されます。
// 異なる数値とする場合は, time.Now().UnixNano() のように常に変化する値をシードしてください。
rand.Seed(42)
answers := []string{
    "It is certain",
    "It is decidedly so",
    "Without a doubt",
    "Yes definitely",
    "You may rely on it",
    "As I see it yes",
    "Most likely",
    "Outlook good",
    "Yes",
    "Signs point to yes",
    "Reply hazy try again",
    "Ask again later",
    "Better not tell you now",
    "Cannot predict now",
    "Concentrate and ask again",
    "Don't count on it",
    "My reply is no",
    "My sources say no",
    "Outlook not so good",
    "Very doubtful",
}
fmt.Println("Magic 8-Ball says:", answers[rand.Intn(len(answers))])

出力:

Magic 8-Ball says: As I see it yes

例 (Rand)

この例は, *Rand での各メソッドの使用法を示しています。 グローバル関数の使用方法は,レシーバなしでは同じです。

コード:

// ジェネレータを作成してシードします。
// 通常, time.Now().UnixNano() のように,固定されていないシードを使用する必要があります。
// 固定シードを使用すると,実行ごとに同じ出力が生成されます。
r := rand.New(rand.NewSource(99))

// ここでのタブライターは,整列出力を生成するのを助けます。
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 と Float64 の値は [0, 1) にあります。
show("Float32", r.Float32(), r.Float32(), r.Float32())
show("Float64", r.Float64(), r.Float64(), r.Float64())

// ExpFloat64 の値は平均 1 ですが,指数関数的に減衰します。
show("ExpFloat64", r.ExpFloat64(), r.ExpFloat64(), r.ExpFloat64())

// NormFloat64 の値は,平均 0 ,標準偏差 1 です。
show("NormFloat64", r.NormFloat64(), r.NormFloat64(), r.NormFloat64())

// Int31, Int63 ,および Uint32 は,指定された幅の値を生成します。
// Int メソッドは, 'int' のサイズに応じて,Int31 または Int63 のいずれかと同じです。
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 ,および Int63n は,出力を < n に制限します。
// 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 は,数 [0, n) のランダムな置換を生成します。
show("Perm", r.Perm(5), r.Perm(5), r.Perm(5))

出力:

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]

func ExpFloat64

func ExpFloat64() float64

ExpFloat64 は, (0, +math.MaxFloat64] の範囲で指数パラメーター (lambda) が 1 ,平均値がデフォルトの Source から 1/lambda (1) の指数分布を持つ float64 を返します。 異なるレートパラメータを使用すると,呼び出し側は次の方法で出力を調整できます。

sample = ExpFloat64() / desiredRateParameter

func Float32

func Float32() float32

Float32 は,デフォルトの Source から [0.0,1.0) の疑似乱数を float32 で返します。

func Float64

func Float64() float64

Float64 は,デフォルトの Source から [0.0,1.0) の疑似乱数を float64 で返します。

func Int

func Int() int

Int は,デフォルトの Source から負でない擬似乱数の int を返します。

func Int31

func Int31() int32

Int31 は,デフォルトの Source から,負でない疑似乱数の 31 ビット整数を int32 で返します。

func Int31n

func Int31n(n int32) int32

Int31n は,デフォルトの Source から,負でない疑似乱数を [0,n) で int32 で返します。 n <= 0 の場合はパニックします。

func Int63

func Int63() int64

Int63 は,デフォルトの Source から負でない疑似乱数 63 ビット整数を int64 で返します。

func Int63n

func Int63n(n int64) int64

Int63n は,デフォルトの Source から [0,n) の範囲の負でない疑似乱数を int64 で返します。 n <= 0 の場合はパニックします。

func Intn

func Intn(n int) int

Intn は,デフォルトの Source から,負でない疑似乱数を [0,n) で返します。 n <= 0 の場合はパニックします。

コード:

// 同じ値でシードすると,実行ごとに同じランダムシーケンスが生成されます。
// 異なる数値とする場合は, time.Now().UnixNano() のように常に変化する値をシードしてください。
rand.Seed(86)
fmt.Println(rand.Intn(100))
fmt.Println(rand.Intn(100))
fmt.Println(rand.Intn(100))

出力:

42
76
30

func NormFloat64

func NormFloat64() float64

NormFloat64 は,デフォルトの Source から標準正規分布 (mean = 0, stddev = 1) で [-math.MaxFloat64, +math.MaxFloat64] の範囲の正規分布 float64 を返します。 別の正規分布を生成するために,呼び出し側は次のように出力を調整できます。

sample = NormFloat64() * desiredStdDev + desiredMean

func Perm

func Perm(n int) []int

Perm は,デフォルトの Source から整数 [0,n) の擬似乱数置換を n 整数のスライスとして返します。

コード:

for _, value := range rand.Perm(3) {
    fmt.Println(value)
}

出力:

1
2
0

func Read 1.6

func Read(p []byte) (n int, err error)

Read は,デフォルトの Source から len(p) 個のランダムバイトを生成し,それらを p に書き込みます。 常に len(p) と nil エラーを返します。 Rand.Read メソッドとは異なり, Read は平行使用に対して安全です。

func Seed

func Seed(seed int64)

Seed は与えられた seed 値を使ってデフォルトの Source を確定的な状態に初期化します。 Seed が呼び出されない場合,ジェネレータは Seed(1) によってシードされたかのように動作します。 2^31-1 で除算したときに同じ剰余を持つシード値は,同じ擬似乱数列を生成します。 Rand.Seed メソッドとは異なり, Seed は平行に使用しても安全です。

func Shuffle 1.10

func Shuffle(n int, swap func(i, j int))

Shuffle は,デフォルトの Source を使用して要素の順序を疑似乱数化します。 n は要素数です。 n < 0 の場合,パニックします。 swap は,要素をインデックス i と j で交換します。

コード:

words := strings.Fields("ink runs from the corners of my mouth")
rand.Shuffle(len(words), func(i, j int) {
    words[i], words[j] = words[j], words[i]
})
fmt.Println(words)

出力:

[mouth my the of runs corners from ink]

例 (SlicesInUnison)

コード:

numbers := []byte("12345")
letters := []byte("ABCDE")
// 数字をシャッフルし,対応するエントリを文字で入れ替えます。
rand.Shuffle(len(numbers), func(i, j int) {
    numbers[i], numbers[j] = numbers[j], numbers[i]
    letters[i], letters[j] = letters[j], letters[i]
})
for i := range numbers {
    fmt.Printf("%c: %c\n", letters[i], numbers[i])
}

出力:

C: 3
D: 4
A: 1
E: 5
B: 2

func Uint32

func Uint32() uint32

Uint32 は,既定の Source から疑似乱数 32 ビット値を uint32 で返します。

func Uint64 1.8

func Uint64() uint64

Uint64 は,デフォルトの Source から疑似乱数 64 ビット値を uint64 で返します。

type Rand

Rand は乱数のソースです。

type Rand struct {
    // エクスポートされていないフィールドがあります
}

func New

func New(src Source) *Rand

New は, src の乱数を使って他の乱数を生成する新しい Rand を返します。

func (*Rand) ExpFloat64

func (r *Rand) ExpFloat64() float64

ExpFloat64 は, (0, +math.MaxFloat64] の範囲で,指数パラメーター (lambda) が 1 ,平均値が 1/lambda (1) の指数分布を持つ float64 を返します。 異なるパラメーターを用いた分布を出力したい場合,呼び出し元は,以下を使用して調整できます。

sample = ExpFloat64() / desiredRateParameter

func (*Rand) Float32

func (r *Rand) Float32() float32

Float32 は [0.0,1.0) の疑似乱数を float32 で返します。

func (*Rand) Float64

func (r *Rand) Float64() float64

Float64 は [0.0,1.0) の疑似乱数を float64 で返します。

func (*Rand) Int

func (r *Rand) Int() int

Int は,負でない疑似乱数 int を返します。

func (*Rand) Int31

func (r *Rand) Int31() int32

Int31 は,負でない疑似乱数の 31 ビット整数を int32 として返します。

func (*Rand) Int31n

func (r *Rand) Int31n(n int32) int32

Int31n は, [0,n) の負でない擬似乱数を int32 として返します。 n <= 0 の場合はパニックします。

func (*Rand) Int63

func (r *Rand) Int63() int64

Int63 は,負でない疑似乱数 63 ビット整数を int64 として返します。

func (*Rand) Int63n

func (r *Rand) Int63n(n int64) int64

Int63n は int64 として [0,n) の負でない擬似乱数を返します。 n <= 0 の場合はパニックします。

func (*Rand) Intn

func (r *Rand) Intn(n int) int

Intn は [0,n) の負でない擬似乱数を int で返します。 n <= 0 の場合はパニックします。

func (*Rand) NormFloat64

func (r *Rand) NormFloat64() float64

NormFloat64 は,標準正規分布 (mean = 0, stddev = 1) で, -math.MaxFloat64 から +math.MaxFloat64 までの範囲の正規分布 float64 を返します。 別の正規分布を生成するために,呼び出し側は次のように出力を調整できます。

sample = NormFloat64() * desiredStdDev + desiredMean

func (*Rand) Perm

func (r *Rand) Perm(n int) []int

Perm は,整数 [0,n) の疑似乱数置換を n 整数のスライスとして返します。

func (*Rand) Read 1.6

func (r *Rand) Read(p []byte) (n int, err error)

Read は len(p) 個のランダムバイトを生成し,それらを p に書き込みます。 常に len(p) と nil エラーを返します。 Read は他の Rand メソッドと平行に呼び出さないでください。

func (*Rand) Seed

func (r *Rand) Seed(seed int64)

Seed は渡されたシード値を使用してジェネレータを決定論的状態に初期化します。 Seed は他の Rand メソッドと平行に呼び出さないでください。

func (*Rand) Shuffle 1.10

func (r *Rand) Shuffle(n int, swap func(i, j int))

Shuffle は要素の順序を疑似乱数化します。 n は要素数です。 n < 0 の場合,パニックします。 swap は,要素をインデックス i と j で交換します。

func (*Rand) Uint32

func (r *Rand) Uint32() uint32

Uint32 は,擬似乱数 32 ビット値を uint32 として返します。

func (*Rand) Uint64 1.8

func (r *Rand) Uint64() uint64

Uint64 は,擬似乱数 64 ビット値を uint64 として返します。

type Source

Source は,範囲 [0, 1<<63) の一様分布疑似乱数 int64 値のソースを表します。

type Source interface {
    Int63() int64
    Seed(seed int64)
}

func NewSource

func NewSource(seed int64) Source

NewSource は,与えられた値でシードされた新しい擬似乱数 Source を返します。 最上位関数で使用されるデフォルトの Source とは異なり,この source は複数のゴルーチンによる平行使用に対して安全ではありません。

type Source64 1.8

Source64 は,範囲 [0, 1<<64) にある一様分布の擬似乱数 uint64 値も直接生成できる Source です。 Rand r の内部の Source が Source64 を実装している場合, r.Uint64 は s.Int63 を 2 回呼び出すのではなく, s.Uint64 を 1 回呼び出した結果を返します。

type Source64 interface {
    Source
    Uint64() uint64
}

type Zipf

Zipf は Zipf 分散変量を生成します。

type Zipf struct {
    // エクスポートされていないフィールドがあります
}

func NewZipf

func NewZipf(r *Rand, s float64, v float64, imax uint64) *Zipf

NewZipf は Zipf 変量ジェネレータを返します。 生成器は,P(k) が (v + k) ** (-s) に比例するように値 k ∈ [0, imax] を生成します。 要件: s > 1 および v >= 1

func (*Zipf) Uint64

func (z *Zipf) Uint64() uint64

Uint64 は, Zipf オブジェクトによって記述された Zipf 分布から引き出された値を返します。