【Golang】生成随机数,指定区间随机数
·
go语言的随机数,不是真正的随机,而是根据一定的公式算法计算出来的,也称伪随机数
随机数操作都在math/rand包下
一、生成一个随机数
请注意,未设定种子数而产生的随机数是固定数,下面的代码,无论执行多少次,输出结果都是一样的
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,
二、生成随机的随机数
每次执行时更新种子数会产生不同的随机数,
时间作为种子数
这里有一个坑:如果seed值固定,那么每次程序重启后重新生成随机数会重复上一次的随机数
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
四、真随机 crypto/rand
package main
import (
"fmt"
"crypto/rand"
)
func main() {
for i := 0; i < 4; i++ {
n, _ := rand.Int(rand.Reader, big.NewInt(100))
println(n.Int64())
}
}
输出:
85
9
56
52
完
更多推荐
已为社区贡献5条内容
所有评论(0)