golang學習筆記 rand

2022-04-11 08:52:04 字數 2629 閱讀 6989

在golang中,有兩個包提供了rand,分別為 "math/rand" 和 "crypto/rand",  對應兩種應用場景。

golang 隨機數有乙個很有趣的地方,如果我們不自行定義隨機數種子的話,每次生成的隨機數都是一樣的。golang 在預設隨機的時候,固定以數字 1 作為種子。既然種子都固定了的話,那每次執行的結果當然是一樣的。比如 第二個for迴圈,列印 10 個隨機數,每次執行結果是一模一樣的。 

要解決這個問題,就需要以時間作為隨機數種子。如第乙個for迴圈:

package main

import (

"fmt"

"math/rand"

"time"

)func main()

fmt.println(" ")

//無種子,其實是固定以1為種子

for i := 0; i < 10; i++

}

輸出:

第一次執行結果
276310213 276310213 276310213 939632684 939632684 939632684 939632684 939632684 939632684 939632684

1298498081 2019727887 1427131847 939984059 911902081 1474941318 140954425 336122540 208240456 646203300

第二次執行結果
1101837366 1101837366 1101837366 1101837366 1101837366 1101837366 1101837366 1101837366 1101837366 1101837366

1298498081 2019727887 1427131847 939984059 911902081 1474941318 140954425 336122540 208240456 646203300

第三次執行結果
483465292 483465292 483465292 483465292 1406725908 1406725908 1406725908 1406725908 1406725908 1406725908

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達到長度一致,如

package main

import (

"fmt"

"math/rand"

)func main()

}

輸出

498081 727887 131847 984059 902081 941318 954425 122540 240456 203300

package main

import (

"fmt"

"math/rand"

"time"

)func init()

func main()

輸出:

1910927962

450.9863281

」crypto/rand「 包實現了用於加解密的更安全的隨機數生成器:該包中常用的是 func read(b byte) (n int, err error) 這個方法, 將隨機的byte值填充到b 陣列中,以供b使用。示例如下:

package main

import (

"crypto/rand"

"fmt"

)func main()

fmt.println(b)

}

幾點注意項:

1、如果不使用rand.seed(seed int64),每次執行,得到的隨機數會一樣,程式不停止,一直獲取的隨機數是不一樣的;

2、每次執行時rand.seed(seed int64),seed的值要不一樣,這樣生成的隨機數才會和上次執行時生成的隨機數不一樣;

3、rand.intn(n int)得到的隨機數int i,0 <= i < n。

Golang學習筆記

如果乙個method的receiver是 t,你可以在乙個t型別的例項變數v上面呼叫這個method,而不需要 v去呼叫這個method 即不需要 v method 如果乙個method的receiver是t,你可以在乙個 t型別的變數p上呼叫這個method,而不需要 p去呼叫這個method。i...

golang學習筆記

與c語法不同之處 1.引數列表中各個引數型別相同時可以只寫出最後乙個,如 add x,y int int 2.型別在引數名 變數 函式 後面 3.函式的左大括號要跟函式名同一行,否則編譯不過 4.函式定義要先寫關鍵字func在函式開頭 函式外的每個語句都要以func var等等關鍵字開頭 5.在包或...

Golang學習筆記

package main import fmt func main break default func inte ce select case defer gomap struct chan else goto package switch const fallthrough ifrange ty...