首頁 > 軟體

詳解Go語言中rand(亂數)包的使用

2022-08-16 14:02:39

包"math/rand"

亂數生成器,可以生成 整型或浮點型 的偽亂數。

亂數種子

不同的種子生成不同的亂數,無種子編譯後執行的結果是定值。

通常以時鐘作為引數初始化,rand.Seed(time.Now().UnixNano())。

隨機函數

rand.Int()

返回一個隨機整數

package main
 
import (
    "fmt"
    "math/rand"
    "time"
)
 
func main() {
    nums := make([]int, 3)
    rand.Seed(time.Now().UnixNano())
    for j := 0; j < 10; j++ {
        for i := 0; i < 3; i++ {
            nums[i] = rand.Int()
            fmt.Print(nums[i])
            fmt.Print("t")
        }
        fmt.Println()
    }
}

輸出樣例:

8547983782177664082 3052552994446827557 8765581018699603124

5361649810688880538 7247555699230090626 6921521756094709862

7061225496098313961 4043787731930393944 4881510333544611431

2742623498123161832 8826061491064266771 7540769746514898360

1640562288017497602 7737908637884326151 927535944994878966

7393177581525888978 6511469144479537097 5004275440415177087

88816382525065439     4249346871495670764 8192005441386526629

5523554829668683712 69312977258692669     6584352354533757392

3124007232705319196 5635727296343069158 4284023996891098234

3861142140259007378 4879978992907007455 473741157600402359

rand.Intn(n)

返回0~n間不包括n的非負整數

package main
 
import (
    "fmt"
    "math/rand"
    "time"
)
 
func main() {
    nums := make([]int, 8)
    rand.Seed(time.Now().UnixNano())
    for j := 0; j < 10; j++ {
        for i := 0; i < 8; i++ {
            nums[i] = rand.Intn(100)
            fmt.Print(nums[i])
            fmt.Print("t")

輸出樣例: 

40    63    3    47    76    78    21    44    
43    40    12    87    94    90    97    68    
0    47    14    71    42    52    20    72    
86    57    78    65    53    77    75    70    
76    26    63    40    57    75    77    82    
86    4    46    25    2    67    46    0    
53    64    70    37    59    41    47    63    
80    3    85    42    1    47    31    7    
2    6    2    40    33    49    30    32    
68    90    74    51    40    57    92    97

注:   rand.Intn(100) 與 rand.Int()%100 效果相近。

範例

紅球 1-33 選擇6個 不能重複;藍球 1-16 選擇1個;藍球和紅球可以重複

package main
 
import (
    "fmt"
    "math/rand"
    "time"
)
 
func main() {
    red := make([]int, 6)
    rand.Seed(time.Now().UnixNano())
 
    for i := 0; i < len(red); i++ {
        t := rand.Intn(33) + 1
        for j := 0; j < i; j++ {
            if t == red[j] {
                t = rand.Intn(33) + 1
                j--
            }
        }
        red[i] = t
    }
    fmt.Println("紅球:", red, "n藍球:", rand.Intn(16)+1)
}

輸出:

紅球: [25 28 19 26 33 14]
藍球: 7

其他隨機函數

按型別隨機類

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值

指定隨機範圍類

func (r *Rand) Int31n(n int32) int32
func (r *Rand) Int63n(n int64) int64

偽隨機排列的切片

返回一個有n個元素的,[0,n)範圍內整數的偽隨機排列的切片

fmt.Println(rand.Perm(10)) // [3 7 0 1 9 2 4 5 6 8]

生成標準正態分佈

返回一個服從標準正態分佈(標準差=1,期望=0)

取值範圍在[-math.MaxFloat64, +math.MaxFloat64]的float64值。

fmt.Println(rand.NormFloat64())
//生成不同的正態分佈值
fmt.Println(rand.NormFloat64() * 標準差 + 期望)

生成標準指數分佈

返回一個服從標準指數分佈(率引數=1,率引數是期望的倒數)

取值範圍在(0, +math.MaxFloat64]的float64值。

fmt.Println(rand.ExpFloat64())
//生成不同的指數分佈值
fmt.Println(rand.ExpFloat64() / 率引數)

到此這篇關於詳解Go語言中rand(亂數)包的使用的文章就介紹到這了,更多相關Go語言 rand包內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com