包 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
游戏中出现了八种不同的动物:
编写一个ShuffleAnimals函数,返回一个切片,其中包含这八种动物,顺序随机。