golang——随机数(math/rand包与crypto/rand包)
1、math/rand 包
1.1、math/rand 包实现了伪随机数生成器
1.2、主要方法
(1)func Seed(seed int64)
设置随机种子,不设置则默认Seed(1)
(2)func Int() int
返回一个非负的伪随机int值
(3)func Int31() int32
返回一个int32类型的非负的31位伪随机数
(4)func Int63() int64
返回一个int64类型的非负的63位伪随机数
(5)func Intn(n int) int
返回一个取值范围在[0,n)的伪随机int值,如果n<=0会panic
(6)func Int31n(n int32) int32
返回一个取值范围在[0,n)的伪随机int32值,如果n<=0会panic
(7)func Int63n(n int64) int64
返回一个取值范围在[0, n)的伪随机int64值,如果n<=0会panic
(8)func Float32() float32
返回一个取值范围在[0.0, 1.0)的伪随机float32值
(9)func Float64() float64
返回一个取值范围在[0.0, 1.0)的伪随机float64值
(10)func Perm(n int) []int
返回一个有n个元素的,[0,n)范围内整数的伪随机排列的切片
1.3、代码示例
package main import ( "fmt" "math/rand" "time" ) func main() { //不设置随机种子,每次运行结果都一样 fmt.Println(rand.Intn(10)) fmt.Println(rand.Float64()) //设置随机种子 rand.Seed(time.Now().UnixNano()) fmt.Println(rand.Intn(10)) fmt.Println(rand.Float64()) //随机数切片 fmt.Println(rand.Perm(5)) //输出 // 1 // 0.9405090880450124 // 6 // 0.29007018033257015 // [3 4 0 1 2] }
1.4、应用场景
(1)验证码
(2)随机密码
(3)抽奖
(4)随机算法
2、crypto/rand 包
2.1、crypto/rand 包实现了用于加解密的更安全的随机数生成器
2.2、主要方法
(1)func Int(rand io.Reader, max *big.Int) (n *big.Int, err error)
返回一个在[0, max)区间服从均匀分布的随机值,如果max<=0则会panic
(2)func Prime(rand io.Reader, bits int) (p *big.Int, err error)
返回一个具有指定字位数(二进制的位数)的数字,该数字具有很高可能性是质数。如果从rand读取时出错,或者bits<2会返回错误
(3)func Read(b []byte) (n int, err error)
本函数是一个使用io.ReadFull调用Reader.Read的辅助性函数。当且仅当err == nil时,返回值n == len(b)
2.3、代码示例
package main import ( "crypto/rand" "encoding/base64" "fmt" "math/big" ) func main() { //1、Int n, err := rand.Int(rand.Reader, big.NewInt(128)) if err == nil { fmt.Println("rand.Int:", n, n.BitLen()) } //2、Prime p, err := rand.Prime(rand.Reader, 5) if err == nil { fmt.Println("rand.Prime:", p) } //3、Read b := make([]byte, 32) m, err := rand.Read(b) if err == nil { fmt.Println("rand.Read:", b[:m]) fmt.Println("rand.Read:", base64.URLEncoding.EncodeToString(b)) } // rand.Int: 92 7 // rand.Prime: 29 // rand.Read: [207 47 241 208 190 84 109 134 86 106 87 223 111 113 203 155 44 118 71 20 186 62 66 130 244 98 97 184 8 179 6 230] // rand.Read: zy_x0L5UbYZWalffb3HLmyx2RxS6PkKC9GJhuAizBuY= }
2.4、应用场景
(1)生成随机加密串