golang生成随机数

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)
		}
	}

你可能感兴趣的:(Go,go)