Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

  1. トップページ
  2. Go辞典
  3. math/rand パッケージ

math/rand パッケージ

Goの『math/rand』パッケージを使うと乱数を生成できます。Go 1.20以降はグローバルな乱数生成器が自動的にシード設定されるため、初期化なしでそのまま使えます。

構文
import "math/rand"

// 0以上n未満のランダムな整数を返します。
n := rand.Intn(100)

// 0.0以上1.0未満のランダムなfloat64を返します。
f := rand.Float64()

// Go 1.20以降:ローカルな乱数生成器を作成します。
r := rand.New(rand.NewSource(42))  // シード42で固定します。
n2 := r.Intn(10)

// スライスをランダムにシャッフルします。
s := []int{1, 2, 3, 4, 5}
rand.Shuffle(len(s), func(i, j int) { s[i], s[j] = s[j], s[i] })
関数一覧
関数概要
rand.Intn(n)0以上n未満のランダムなintを返します。
rand.Int()ランダムな非負のintを返します。
rand.Int63()ランダムな非負のint64を返します。
rand.Float64()[0.0, 1.0)のランダムなfloat64を返します。
rand.Float32()[0.0, 1.0)のランダムなfloat32を返します。
rand.Shuffle(n, swap)swap関数を使ってn要素をランダムに並べ替えます。
rand.New(src)指定したSourceを使う乱数生成器を作成します。
rand.NewSource(seed)指定したシード値のSourceを作成します(再現性あり)。
サンプルコード
package main

import (
    "fmt"
    "math/rand"
)

func main() {
    // --- グローバル乱数生成器(Go 1.20以降は自動シード設定)---
    fmt.Println("--- ランダムな整数 ---")
    for i := 0; i < 5; i++ {
        fmt.Printf("rand.Intn(100) = %d\n", rand.Intn(100))
    }

    fmt.Println()

    // 浮動小数点数の乱数です。
    fmt.Println("--- ランダムなfloat64 ---")
    for i := 0; i < 3; i++ {
        fmt.Printf("rand.Float64() = %.4f\n", rand.Float64())
    }

    fmt.Println()

    // 任意の範囲の整数乱数(例: 1〜6のサイコロ)です。
    fmt.Println("--- サイコロ(1〜6)---")
    for i := 0; i < 5; i++ {
        dice := rand.Intn(6) + 1  // Intn(6)は0〜5なので+1します。
        fmt.Printf("サイコロ: %d\n", dice)
    }

    fmt.Println()

    // スライスのシャッフルです。
    fmt.Println("--- シャッフル ---")
    s := []int{1, 2, 3, 4, 5}
    fmt.Println("シャッフル前:", s)
    rand.Shuffle(len(s), func(i, j int) {
        s[i], s[j] = s[j], s[i]
    })
    fmt.Println("シャッフル後:", s)

    fmt.Println()

    // シード固定で再現性のある乱数を生成します。
    fmt.Println("--- シード固定(再現性あり)---")
    r1 := rand.New(rand.NewSource(42))
    r2 := rand.New(rand.NewSource(42))
    fmt.Println("r1の乱数:", r1.Intn(100), r1.Intn(100), r1.Intn(100))
    fmt.Println("r2の乱数:", r2.Intn(100), r2.Intn(100), r2.Intn(100))
    // 同じシードなので同じ結果になります。
}
概要

Go 1.20以降はグローバルな乱数生成器が実行ごとに自動でランダムシードが設定されます。そのため、以前必要だった『rand.Seed(time.Now().UnixNano())』の初期化コードは不要になりました。テストで再現性が必要な場合は『rand.New(rand.NewSource(シード値))』でローカルな生成器を作成してください。

math/randが生成する乱数は暗号学的に安全ではありません。パスワードやトークンなどセキュリティが必要な乱数は『crypto/rand』パッケージを使ってください。

math関数全般は『math パッケージ』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。