日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

golang?隨機數的兩種方式_Golang

作者:@航空母艦 ? 更新時間: 2022-08-27 編程語言

golang支持兩種隨機數生成方式:

  • math/rand ? ? ? ? ?// 偽隨機
  • crypto/rand ? ? ? ?// 真隨機

math/rand偽隨機生成的數字是確定的,不論在什么機器、什么時間,只要執行的隨機代碼一樣,那么生成的隨機數就一樣。為了盡量隨機性,那么我們可以每次使用不同的seed來啟動程序,就可以保證每次啟動都產生新的隨機數,聰明的你肯定想到了使用時間戳

func main() {
    fmt.Println(rand.Intn(100))
    //設置隨機數種子,由于種子數值,每次啟動都不一樣
    //所以每次隨機數都是隨機的
    rand.Seed(time.Now().UnixNano())
    //隨機生成100以內的正整數
    fmt.Println(rand.Intn(100))
}

crypto/rand 就是從這個地方讀“真隨機”數字返回,但性能比較慢。比上面慢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)
}

通用隨機數算法

package main
 
import (
    "fmt"
    "math/rand"
    "time"
)
 
func main() {
    fmt.Println(randomString(6, 0))
}
 
/**
* size 隨機碼的位數
* kind 0    // 純數字
       1    // 小寫字母
       2    // 大寫字母
       3    // 數字、大小寫字母
*/
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)
}

原文鏈接:https://blog.csdn.net/hudeyong926/article/details/124857119

欄目分類
最近更新