【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,

二、生成随机的随机数

每次执行时更新种子数会产生不同的随机数, 时间作为种子数
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 完