go语言的随机数,不是真正的随机,而是根据一定的公式算法计算出来的,也称伪随机数 随机数操作都在math/rand包下
当指定了数值范围再执行,会产生不同随机数吗? 事实上也不会,仅指定范围,种子数未设定,每次运行产生的随机也是固定值
rand.Seed(seed) 设定种子数后,再执行会产生不同的随机数吗?答案是否定的,多次执行还是输出一样的结果,原因是相同种子数只产生相同的随机数
一、生成一个随机数
请注意,未设定种子数而产生的随机数是固定数,下面的代码,无论执行多少次,输出结果都是一样的package main
import (
"fmt"
"math/rand"
)
func main() {
r := rand.Int()
fmt.Println(r)
}
多次输出: 5577006791947779410 5577006791947779410当指定了数值范围再执行,会产生不同随机数吗? 事实上也不会,仅指定范围,种子数未设定,每次运行产生的随机也是固定值
func main() {
for i := 0; i < 5; i++ {
r := rand.Intn(10)
fmt.Printf("%d,", r)
}
}
多次输出: 1,7,7,9,1, 1,7,7,9,1,rand.Seed(seed) 设定种子数后,再执行会产生不同的随机数吗?答案是否定的,多次执行还是输出一样的结果,原因是相同种子数只产生相同的随机数
func main() {
rand.Seed(100)
for i := 0; i < 5; i++ {
r := rand.Intn(10)
fmt.Printf("%d,", r)
}
}
多次执行输出: 3,8,0,0,2, 3,8,0,0,2,二、生成随机的随机数
每次执行时更新种子数会产生不同的随机数, 时间作为种子数package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
fmt.Printf("%d, ", rand.Intn(100))
fmt.Printf("%d, ", rand.Int())
}
多次输出: 9, 7259445416375718725, 29, 8751451573146163832,三、指定范围随机数
0-100随机数rand.Seed(time.Now().UnixNano())
r := rand.Intn(100)
fmt.Println(r)
输出: 53 81 100-1000随机数 由于go语言未提供2个区间参数,只一个参数的情况下先随机0到(m-n),再用加 n的方式解决 生成0-900随机数,加100即可rand.Seed(time.Now().UnixNano())
r := rand.Intn(900) + 100
fmt.Println(r)
输出: 105 651 5000-90000随机数 生成0-85000随机数,加5000即可rand.Seed(time.Now().UnixNano())
r := rand.Intn(85000) + 5000
fmt.Println(r)
输出: 27000 61201 完