golang 隨機數(shù)的兩種方式
golang支持兩種隨機數(shù)生成方式:
- math/rand // 偽隨機
- crypto/rand // 真隨機
math/rand偽隨機生成的數(shù)字是確定的,不論在什么機器、什么時間,只要執(zhí)行的隨機代碼一樣,那么生成的隨機數(shù)就一樣。為了盡量隨機性,那么我們可以每次使用不同的seed來啟動程序,就可以保證每次啟動都產(chǎn)生新的隨機數(shù),聰明的你肯定想到了使用時間戳
func main() {
fmt.Println(rand.Intn(100))
//設置隨機數(shù)種子,由于種子數(shù)值,每次啟動都不一樣
//所以每次隨機數(shù)都是隨機的
rand.Seed(time.Now().UnixNano())
//隨機生成100以內的正整數(shù)
fmt.Println(rand.Intn(100))
}
crypto/rand 就是從這個地方讀“真隨機”數(shù)字返回,但性能比較慢。比上面慢10倍以上
package main
import (
"crypto/rand"
"encoding/binary"
"fmt"
"time"
)
func main() {
var n int32
binary.Read(rand.Reader, binary.LittleEndian, &n)
fmt.Println(n)
}
通用隨機數(shù)算法
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
fmt.Println(randomString(6, 0))
}
/**
* size 隨機碼的位數(shù)
* kind 0 // 純數(shù)字
1 // 小寫字母
2 // 大寫字母
3 // 數(shù)字、大小寫字母
*/
func randomString(size int, kind int) string {
ikind, kinds, rsbytes := kind, [][]int{[]int{10, 48}, []int{26, 97}, []int{26, 65}}, make([]byte, size)
isAll := kind > 2 || kind < 0
rand.Seed(time.Now().UnixNano())
for i := 0; i < size; i++ {
if isAll { // random ikind
ikind = rand.Intn(3)
}
scope, base := kinds[ikind][0], kinds[ikind][1]
rsbytes[i] = uint8(base + rand.Intn(scope))
}
return string(rsbytes)
}到此這篇關于golang 隨機數(shù)的兩種方式的文章就介紹到這了,更多相關golang 隨機數(shù)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
gin框架Context如何獲取Get?Query?Param函數(shù)數(shù)據(jù)
這篇文章主要為大家介紹了gin框架Context?Get?Query?Param函數(shù)獲取數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03
利用systemd部署golang項目的實現(xiàn)方法
這篇文章主要介紹了利用systemd部署golang項目的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-11-11

