• 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)生成随机加密串

    笃志:“博学而笃志,切问而近思,仁在其中矣。”
    弘毅:“士不可以不弘毅,任重而道远。”
    止于至善:“大学之道,在明明德,在亲民,在止于至善。”
    关注:笃志弘毅,止于至善
  • 相关阅读:
    Docker宿主机登陆Container方法
    Get Docker for CentOS and Installing Docker
    CentOS7网络配置
    国内npm镜像源推荐及使用
    CentOS6.5源码安装python3.5.2
    阿里云SLB后Nginx、Tomcat获取真实IP
    MacOS清除管理员密码
    SVN-修改已提交的日志
    爬虫的初始和requests模块基础用法
    利用面向对象写的登录与注册
  • 原文地址:https://www.cnblogs.com/dzhy/p/11023158.html
Copyright © 2020-2023  润新知