package rand
import "math/rand"
rand
包实现了伪随机数生成器。
常用随机数生成方法
这里只介绍自己用到过的部分,更多函数/方法请参考标准库文档中文版
rand.Seed:设置随机数种子
func Seed(seed int64)
使用给定的seed
将默认资源初始化到一个确定的状态;如未调用Seed
,默认资源的行为就好像调用了Seed(1)
。
如果程序每次运行,随机数种子都相同,那么使用随机数函数得到的随机数都是一样的,想让程序每次运行得到的随机数都不同,就需要让每次的随机数种子不相同。
示例:
func main() {
rand.Seed(time.Now().UnixNano()) // 取纳秒时间戳,可以保证每次的随机数种子都不同
for i := 0; i < 5; i++ {
fmt.Println(rand.Intn(1000)) // Intn(n)返回一个取值范围在[0,n)的伪随机int值
}
}
第一次输出:
357
762
182
207
646
第二次输出:
435
28
673
573
491
rand.Int:生成非负伪随机int值
func Int() int
返回一个非负的伪随机int值。
还有生成各种整型随机数的函数:
func Int31() int32
:返回一个int32类型的非负的31位伪随机数;func Int63() int64
:返回一个int64类型的非负的63位伪随机数;func Uint32() uint32
:返回一个uint32类型的非负的32位伪随机数。
rand.Intn(n):生成取值范围[0, n)的伪随机int值
func Intn(n int) int
返回一个取值范围在[0,n)的伪随机int值,如果n<=0会panic。
还有生成各种整型范围随机数的函数:
func Int31n(n int32) int32
:返回一个取值范围在[0,n)的伪随机int32值,如果n<=0会panic;func Int63n(n int64) int64
:返回一个取值范围在[0, n)的伪随机int64值,如果n<=0会panic。
rand.Float32:生成取值范围[0.0, 1.0)的伪随机float32值
func Float32() float32
返回一个取值范围在[0.0, 1.0)的伪随机float32值。
还有生成float64值的函数:
func Float64() float64
返回一个取值范围在[0.0, 1.0)的伪随机float64值。
NormFloat64:标准正态分布
func NormFloat64() float64
返回一个服从标准正态分布(标准差=1,期望=0)、取值范围在[-math.MaxFloat64, +math.MaxFloat64]
的float64
值。
如果要生成不同的正态分布值,调用者可用如下代码调整输出:
sample = NormFloat64() * 标准差 + 期望
ExpFloat64:标准指数分布
func ExpFloat64() float64
返回一个服从标准指数分布(率参数=1,率参数是期望的倒数)、取值范围在(0, +math.MaxFloat64]
的float64
值。
如要生成不同的指数分布值,调用者可用如下代码调整输出:
sample = ExpFloat64() / 率参数
Perm:生成随机排列的整数切片
func Perm(n int) []int
返回一个有n个元素的,[0,n)范围内整数的伪随机排列的切片。
示例:
fmt.Println(rand.Perm(10)) // [3 7 0 1 9 2 4 5 6 8]