對於Random的使用,在業務中使用頻率是非常高的,本文就小結下常用的方法:
在Golang中,有兩個包提供了rand,分別為 "math/rand" 和 "crypto/rand", 對應兩種應用場景。
一、"math/rand" 包實現了偽隨機數生成器。也就是生成 整形和浮點型。
該包中根據生成偽隨機數是是否有種子(可以理解為初始化偽隨機數),可以分為兩類:
1、有種子。通常以時鍾,輸入輸出等特殊節點作為參數,初始化。該類型生成的隨機數相比無種子時重復概率較低。
2、無種子。可以理解為此時種子為1, Seek(1)。
import ( "fmt" "math/rand" "time" ) func main() { for i := 0; i < 10; i++ { r := rand.New(rand.NewSource(time.Now().UnixNano())) fmt.Printf("%d ", r.Int31()) } fmt.Println("") for i := 0; i < 10; i++ { fmt.Printf("%d ", rand.Int31()) } }
// 1278610617 1508223627 2035989429 921556381 1472325922 1058000409 246974909 2131355695 160634752 1895791427
// 1298498081 2019727887 1427131847 939984059 911902081 1474941318 140954425 336122540 208240456 646203300
常用的方法有:(以有種子的為例,無種子的直接通過 rand 報名調用對應的方法)
1> 按類型隨機類:
func (r *Rand) Int() int func (r *Rand) Int31() int32 func (r *Rand) Int63() int64 func (r *Rand) Uint32() uint32 func (r *Rand) Float32() float32 // 返回一個取值范圍在[0.0, 1.0)的偽隨機float32值 func (r *Rand) Float64() float64 // 返回一個取值范圍在[0.0, 1.0)的偽隨機float64值
2>指定隨機范圍類:
func (r *Rand) Intn(n int) int func (r *Rand) Int31n(n int32) int32 func (r *Rand) Int63n(n int64) int64
拓展:對於需要隨機指定位數的,當位數不夠是,可以通過前邊補0達到長度一致,如:
import ( "fmt" "math/rand" "time" ) func main() {
// 隨機產生4位長度偽隨機數 for i := 0; i < 10; i++ { fmt.Printf("%.4d ", rand.Int31()%10000) } }
// 8081 7887 1847 4059 2081 1318 4425 2540 0456 3300
二、”crypto/rand“ 包實現了用於加解密的更安全的隨機數生成器。
該包中常用的是 func Read(b []byte) (n int, err error) 這個方法, 將隨機的byte值填充到b 數組中,以供b使用。示例如下:
import ( "crypto/rand" "fmt" ) func main() { b := make([]byte, 20) fmt.Println(b) // _, err := rand.Read(b) if err != nil { fmt.Println(err.Error()) } fmt.Println(b) } // [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] // [68 221 145 73 115 224 13 110 218 130 19 139 38 170 145 58 251 188 126 197]
