要在Go中生成一个随机数(实际上是伪随机数,但在本文中,我们将其称为随机数),你只需要使用 math/rand包。
生成随机的整数(也是在给定的范围内)
package main
import (
"fmt"
"math/rand"
"time"
)
func randInt(min, max int) int {
return min + rand.Intn(max-min)
}
func main() {
rand.Seed(time.Now().UnixNano())
fmt.Printf("random integer: %d\n", rand.Int())
fmt.Printf("random integer in range [5, 10): %d\n", randInt(5, 10))
}
生成随机的float64数字(也在给定范围内)
package main
import (
"fmt"
"math/rand"
"time"
)
func randFloat(min, max float64) float64 {
return min + rand.Float64()*(max-min)
}
func main() {
rand.Seed(time.Now().UnixNano())
fmt.Printf("random float64: %f\n", rand.Float64())
fmt.Printf("random float64 in range [2.4, 3.2): %f\n", randFloat(2.4, 3.2))
}
它是如何工作的
-
Seed
rand.Seed(time.Now().UnixNano())在
main函数的第一行,我们设置种子来初始化一个伪随机数生成器。默认的math/rand数字发生器是确定性的,所以它将为相同的种子值提供相同的输出序列。你可以通过删除主函数的第一行并运行几次程序来检查这一点--我们总是得到相同的 "随机 "数字。这是因为该算法通过对前一个值进行一些操作来产生新的值,当初始值(种子值)保持不变时,我们得到的输出数字是一样的。为了避免这种情况,我们使用当前时间--time.Now().UnixNano()作为种子。 -
随机数生成函数
fmt.Printf("random integer: %d\n", rand.Int()) fmt.Printf("random float64: %f\n", rand.Float64())在种子初始化之后,我们可以使用其中的一个
math/rand包函数生成一个随机数,例如:func Int() intfunc Intn(n int) intfunc Int63() int64func Int63n(n int64) int64func Uint64() uint64func Float64() float64
参见
math/rand包的文档以获得更多信息。 -
一个范围内的随机数
func randInt(min, max int) int { return min + rand.Intn(max-min) }包中没有任何函数可以在
math/rand包中没有函数可以生成[min, max)范围内的随机数,所以我们必须将函数rand.Intn()或rand.Float64()来实现类似的结果。该rand.Intn()可以生成一个范围为[0, n)的值,所以为了得到一个范围为[min, max)的值,我们需要生成一个范围为[0, max-min)的值,然后在结果中加上min。该
rand.Float64()产生的数字在[0.0, 1.0)。为了得到[min, max)范围内的数字,将结果乘以max-min,再加上min。