golang——隨機數(math/rand包與crypto/rand包)

一、math/rand 包

1.一、math/rand 包實現了僞隨機數生成器算法

1.二、主要方法安全

(1)func Seed(seed int64)函數

設置隨機種子,不設置則默認Seed(1)加密

(2)func Int() intspa

返回一個非負的僞隨機int值code

(3)func Int31() int32blog

返回一個int32類型的非負的31位僞隨機數it

(4)func Int63() int64io

返回一個int64類型的非負的63位僞隨機數base64

(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.三、代碼示例

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.四、應用場景

(1)驗證碼

(2)隨機密碼

(3)抽獎

(4)隨機算法 

二、crypto/rand 包 

2.一、crypto/rand 包實現了用於加解密的更安全的隨機數生成器

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.三、代碼示例

package main

import (
	"crypto/rand"
	"encoding/base64"
	"fmt"
	"math/big"
)

func main() {
	//一、Int
	n, err := rand.Int(rand.Reader, big.NewInt(128))
	if err == nil {
		fmt.Println("rand.Int:", n, n.BitLen())
	}
	//二、Prime
	p, err := rand.Prime(rand.Reader, 5)
	if err == nil {
		fmt.Println("rand.Prime:", p)
	}
	//三、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.四、應用場景

(1)生成隨機加密串

相關文章
相關標籤/搜索