math/randパッケージは、疑似乱数の生成をサポートしています。
0から99までのランダムな整数を生成するには、次のようにします。
import "math/rand"
n := rand.Intn(100) // n is a random int, 0 <= n < 100
関数rand.Float64は、0.0以上1.0未満のランダムな浮動小数点数を返します。
f := rand.Float64() // f is a random float64, 0.0 <= f < 1.0
スライス(やその他のデータ構造)をシャッフルする機能もあります。
x := []string{"a", "b", "c", "d", "e"}
// shuffling the slice put its elements into a random order
rand.Shuffle(len(x), func(i, j int) {
x[i], x[j] = x[j], x[i]
})
パッケージmath/randが生成する数列は、真の乱数ではありません。
特定の「シード」値を与えると、結果は完全に決まっています。
Go 1.20以降では、シードが自動的にランダムに選ばれるため、プログラムを実行するたびに異なる乱数列が得られます。
以前のバージョンのGoでは、シードはデフォルトで1でした。
そのため、プログラムの実行ごとに異なる数列を得るには、乱数を取得する前に、乱数生成器に手動でシードを設定する必要がありました。たとえば、現在時刻をシードとして使います。
rand.Seed(time.Now().UnixNano())