math/randパッケージは、擬似乱数を生成するための機能を提供します。
0から99までのランダムな整数を生成するには、次のようにします。
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())
エレインは、動物と魔法の杖が登場する新しい子ども向けゲームに取り組んでいます。そろそろ、サイコロを振ったり、ランダムな杖のエネルギーを生成したり、スライスをシャッフルしたりする関数を書く番です。
RollADie関数を実装しましょう。
これは、1から20までの数字が付いた、昔ながらの二十面体のサイコロです。
d := RollADie() // d will be assigned a random int, 1 <= d <= 20
GenerateWandEnergy関数を実装しましょう。
杖のエネルギーは、0.0以上12.0未満のランダムな小数にします。
f := GenerateWandEnergy() // f will be assigned a random float64, 0.0 <= f < 12.0
このゲームには、8種類の動物が登場します。
8種類の動物をランダムな順番に並べたスライスを返すShuffleAnimals関数を書きましょう。