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]

实例需求:10以内随机生成2个幸运数字

package main
 
import (
    "fmt"
    "math/rand"
)
 
func main() {
    fmt.Println("My first lucky number is", rand.Intn(10))
    fmt.Println("My senond lucky number is", rand.Intn(10))
}

输出:

My first lucky number is 1
My senond lucky number is 7

在本环境中,不论编译运行多少次,都是这个输出。

为什么没有产生随机的效果呢?

此程序的运行环境是固定的,因此 rand.Intn 总是会返回相同的数字。 (要得到不同的数字,需为生成器提供不同的种子数)

package main
 
import (
    "fmt"
    "math/rand"
    "time"
)
 
func main() {
    rand.Seed(time.Now().Unix())
    fmt.Println("My first lucky number is", rand.Intn(10))
    fmt.Println("My senond lucky number is", rand.Intn(10))

输出:

My first lucky number is 6
My senond lucky number is 8  

rand.Seed(time.Now().UnixNano())作用:

rand.Intn

获取随机数,不加随机种子,每次遍历获取都是重复的一些随机数据

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

设置随机数种子,加上这行代码,可以保证每次随机都是随机的

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=

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值