go rand 包

go rand 包

rand 介绍

在Golang中,有两个包提供了rand,分别为 “math/rand” 和 “crypto/rand”, 对应两种应用场景

“math/rand” 包实现了伪随机数生成器。也就是生成 整形和浮点型

“crypto/rand” 包实现了用于加解密的更安全的随机数生成器

math/rand

该包中根据生成伪随机数是是否有种子(可以理解为初始化伪随机数),可以分为两类:

1、有种子。通常以时钟,输入输出等特殊节点作为参数,初始化。该类型生成的随机数相比无种子时重复概率较低。

2、无种子。可以理解为此时种子为1, Seek(1)。 // 如果无种子编译后运行的结果是定值

系统每次都会先用Seed函数初始化系统资源,如果用户不提供seed参数,则默认用seed=1来初始化,这就是为什么每次都输出一样的值的原因,而且,Seed方法是并发安全的.
所谓种子,通俗理解可以理解为一个抽奖的奖池,我们自定义一个奖池,从我们的奖池中进行随机抽奖,种子就是我们奖池中的数据

基本使用

func main(){

    r := rand.New(rand.NewSource(time.Now().UnixNano()))
    fmt.Println(r.Int31())
    fmt.Println(rand.Int31()) //没有种子, 一旦编译过后(go build),永远不变
    
    //或者如下方式使用种子
    //设置种子方式一
    rand.Seed(time.Now().Unix())  // 时间戳
    fmt.Println(rand.Intn(999))
    //设置种子方式二
    r:=rand.New(rand.NewSource(time.Now().Unix())) // 生成对象时,设置种子
    fmt.Println(r.Intn(999))

}

常用的方法

1> 按类型随机类:
func (r *Rand) Int() int
func (r *Rand) Int31() int32
func (r *Rand) Int63() int64
func (r *Rand) Uint32() uint32
func (r *Rand) Float32() float32  // 返回一个取值范围在[0.0, 1.0)的伪随机float32值
func (r *Rand) Float64() float64  // 返回一个取值范围在[0.0, 1.0)的伪随机float64值


2> 指定随机范围类:
func (r *Rand) Intn(n int) int  // [0,n)
func (r *Rand) Int31n(n int32) int32
func (r *Rand) Int63n(n int64) int64

生成定长的随机数

//生成固定长度4位,当位数不够是,可以通过前边补0达到长度一致
func main(){
	for i := 0; i < 10; i++ {
		res:=rand.Int31()
		fmt.Print(res,"----")
		fmt.Printf("%.4d \n", res%10000)  // 对10000取余数,固定4位长度
	}
}

crypto/rand

该包中常用的是 func Read(b []byte) (n int, err error)这个方法, 将随机的byte值填充到b 数组中,以供b使用,math/rand下也有Read方法,但是其安全性不如 crypto/rand 下的Read方法

b := make([]byte, 5)
fmt.Println(b)
_, err := rand.Read(b)
if err != nil {
	fmt.Println(err)
}
fmt.Println(b)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

go&Python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值