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())
Elaine 正在開發一款新的兒童遊戲,裡面有動物和魔杖。現在該來寫幾個函式了:擲骰子、產生隨機的魔杖能量,還有打亂切片。
實作一個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 種不同的動物:
寫一個ShuffleAnimals函式,回傳一個把這 8 種動物隨機排列的切片。