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ù)值,每次啟動都不一樣 //所以每次隨機數(shù)都是隨機的 rand.Seed(time.Now().UnixNano()) //隨機生成100以內(nèi)的正整數(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) }
到此這篇關(guān)于golang 隨機數(shù)的兩種方式的文章就介紹到這了,更多相關(guān)golang 隨機數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Golang的singleflight防止緩存擊穿的方法
這篇文章主要介紹了使用Golang的singleflight防止緩存擊穿的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04golang實現(xiàn)實時監(jiān)聽文件并自動切換目錄
這篇文章主要給大家介紹了golang實現(xiàn)實時監(jiān)聽文件,并自動切換目錄,文中通過代碼示例給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作有一定的參考價值,需要的朋友可以參考下2023-12-12golang文件服務(wù)器的兩種方式(可以訪問任何目錄)
這篇文章主要介紹了golang文件服務(wù)器的兩種方式,可以訪問任何目錄,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04golang獲取變量或?qū)ο箢愋偷膸追N方式總結(jié)
在golang中并沒有提供內(nèi)置函數(shù)來獲取變量的類型,但是通過一定的方式也可以獲取,下面這篇文章主要給大家介紹了關(guān)于golang獲取變量或?qū)ο箢愋偷膸追N方式,需要的朋友可以參考下2022-12-12