1.通过math/rand包生成随机数
今天刚完成了一个业务模块,是用golang生成各种类型,且指定范围的随机数,还要可选择是否包含上下限,还要能控制随机数的精度,今天刚做完,迫不及待记录一下。
1.1整数类型随机数:
rand.Seed():设置一个具体的值,随便给个值都可以,golang是通过这个函数设置的值来生成随机数,但是有个问题,如果值是固定的,那么生成的随机数也是固定的,也就是说生成的是伪随机数,不是真随机数,所以最方便的办法就是把时间戳设置进去,因为获取的时间戳不是固定的。
如果是整数类型的随机数,这样就行了,也是写起来最简单的一种方法,其他整数类型同理,改一下rand的函数就行,比如生成int64的,改成rand.Int63n()函数就行,但此方法仅限于整数类型的随机数。
//生成随机数
min := int32(-10) //设置随机数下限
max := int32(100) //设置随机数上限
rand.Seed(time.Now().UnixNano())
//创建100个随机数
for i := 0; i < 100; i++ {
//不包含上下限
num := rand.Int31n(max-min-1) + min + 1
//包含上下限
// num := rand.Int31n(max-min) + min
fmt.Print(num, ",")
if num == min {
fmt.Println("随机数等于下限---------", num)
}
if num == max {
fmt.Println("随机数等于上限---------", num)
}
//脱离范围
if num < min || num > max {
fmt.Println("随机数脱离范围区间-----", num)
}
}
1.2浮点类型随机数:
rand.Float32():rand自带的生成一个0与1之间float32类型的随机数
rand.Float64():rand自带的生成一个0与1之间float64类型的随机数
通过rand自带函数,再加上下面设置的上下限运算,就能够生成浮点类型随机数,但是这种方式只能生成不包含上下限的随机数,包含上下限的生成不了,而且不能控制精度。
//生成随机数
min := float32(-10.5) //设置随机数下限
max := float32(100.05) //设置随机数上限
rand.Seed(time.Now().UnixNano())
//创建100个随机数
for i := 0; i < 100; i++ {
//这种方式,浮点类型不能做到包含上下限
num := rand.Float32()*(max-min) + min
fmt.Print(num, ",")
if num == min {
fmt.Println("随机数等于下限---------", num)
}
if num == max {
fmt.Println("随机数等于上限---------", num)
}
//脱离范围
if num < min || num > max {
fmt.Println("随机数脱离范围区间-----", num)
}
}
1.3用decimal与rand搭配,生成任意类型随机数:
这种方式,可生成任意类型随机数,也都可以包含上下限,还能自己控制精度,推荐这种方式
//生成随机数
PRECISION := int32(1000000000) //这个是随机数的精度和百分比,数值越大,精度越高
min := float32(-10.5) //设置随机数下限
max := float32(100.05) //设置随机数上限
minBool := true //是否包含下限
maxBool := true //是否包含上限
rand.Seed(time.Now().UnixNano())
//创建100个随机数
for i := 0; i < 100; i++ {
//得到百分比
var ratio int32
for {
ratio = rand.Int31n(PRECISION + 1)
//都包含
if minBool && maxBool {
break
}
//都不包含
if !minBool && !maxBool && ratio != 0 && ratio != PRECISION {
break
}
//包含下限,不包含上限
if minBool && !maxBool && ratio != PRECISION {
break
}
//包含上限,不包含下限
if !minBool && maxBool && ratio != 0 {
break
}
}
// 计算公式(max-min)*ratio/PRECISION + min
dec1 := decimal.NewFromFloat32(max).Sub(decimal.NewFromFloat32(min))
dec2 := dec1.Mul(decimal.NewFromInt32(ratio))
dec3 := dec2.Div(decimal.NewFromInt32(int32(PRECISION)))
dec4 := dec3.Add(decimal.NewFromFloat32(min)) //得到随机数结果
number, _ := dec4.Float64() //转换为number类型
num := float32(number) //最终转换成自己想要的类型,得到最终结果
fmt.Print(num, ",")
if num == min {
fmt.Println("随机数等于下限---------", num)
}
if num == max {
fmt.Println("随机数等于上限---------", num)
}
//脱离范围
if num < min || num > max {
fmt.Println("随机数脱离范围区间-----", num)
}
}