标准库之rand

分类: 365彩票数据最专业 作者: admin 时间: 2026-06-26 19:40:28 阅读: 2263
标准库之rand

目录一、rand库介绍二、math/rand1. 基本使用2. 常用的方法3. 生成定长的随机数三、crypto/rand

一、rand库介绍

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

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

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

二、math/rand

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

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

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

系统每次都会先用Seed函数初始化系统资源,如果用户不提供seed参数,则默认用seed=1来初始化,这就是为什么每次都输出一样的值的原因,而且,Seed方法是并发安全的.

所谓种子,通俗理解可以理解为一个抽奖的奖池,我们自定义一个奖池,从我们的奖池中进行随机抽奖,种子就是我们奖池中的数据

1. 基本使用

func main(){

r := rand.New(rand.NewSource(time.Now().UnixNano()))

fmt.Println(r.Int31())

fmt.Println(rand.Int31()) //没有种子, 一旦编译过后(go build),永远不变

//或者如下方式使用种子

rand.Seed(time.Now().UnixNano())

fmt.Println(rand.Int31())

}

2. 常用的方法

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

3. 生成定长的随机数

package main

import (

"fmt"

"math/rand"

)

//生成固定长度4位,当位数不够是,可以通过前边补0达到长度一致

func main(){

for i := 0; i < 10; i++ {

res:=rand.Int31()

fmt.Print(res,"----")

fmt.Printf("%.4d \n", res%10000) // 对10000取余数,固定4位长度

}

}

/*

124796837----6837

1086030680----0680 // 长度不够就补0

254278984----8984

1138194698----4698

1118617863----7863

823792992----2992

38245577----5577

1077832759----2759

1788743202----3202

349751033----1033

*/

三、crypto/rand

该包中常用的是 func Read(b []byte) (n int, err error) 这个方法, 将随机的byte值填充到b 数组中,以供b使用

package main

import (

"crypto/rand"

"fmt"

)

func main() {

b := make([]byte, 5)

fmt.Println(b)

_, err := rand.Read(b)

if err != nil {

fmt.Println(err)

}

fmt.Println(b)

}

/*

[0 0 0 0 0]

[223 116 244 224 32] // 随机生成的

*/

相关推荐