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防止緩存擊穿的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04
golang實現(xiàn)實時監(jiān)聽文件并自動切換目錄
這篇文章主要給大家介紹了golang實現(xiàn)實時監(jiān)聽文件,并自動切換目錄,文中通過代碼示例給大家介紹的非常詳細,對大家的學習或工作有一定的參考價值,需要的朋友可以參考下2023-12-12
golang獲取變量或?qū)ο箢愋偷膸追N方式總結(jié)
在golang中并沒有提供內(nèi)置函數(shù)來獲取變量的類型,但是通過一定的方式也可以獲取,下面這篇文章主要給大家介紹了關(guān)于golang獲取變量或?qū)ο箢愋偷膸追N方式,需要的朋友可以參考下2022-12-12

