網頁

2021/10/1

Golang 產生隨機整數 generate int random number

Go 產生隨機整數的方式如下。


Go可使用標準函式庫math/rand package的Intn(n int)函式產生0到n的隨機整數。

不過直接使用rand.Intn(n int)會發現每次執行時產生的亂數都一樣,例如下面總是印出1。這是因為偽隨機生成器(pseudo-random-generator)的種子(Seed)都是同一個,預設為種子值為1。

package main

import (
    "fmt"
    "math/rand"
)

func main() {
    fmt.Println(rand.Intn(10))
}

而程式執行中持續用rand.Intn(n int)產生的隨機數就會不同,但每次重新執行會發現產生的亂數序列是一樣的,原因也是使用同一個種子。例如下面每次執行產生的亂數序列都是 [1 7 7 9 1]

package main

import (
    "fmt"
    "math/rand"
)

func main() {
    for i := 0; i < 5; i++ {
        fmt.Println(rand.Intn(10))
    }
}

因此要讓每次執行程式時產生不同的隨機數列,就要餵給不同的種子值。使用rand.Seed(seed int64)設定全域種子,傳入time.Now().UnixNano()以現在時間的Unix時間作為種子值。例如下面每次執行時產生的隨機數列都不同。

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    rand.Seed(time.Now().UnixNano())
    for i := 0; i < 5; i++ {
        fmt.Println(rand.Intn(10))
    }
}

產生特定區間的整數亂數寫法如下,例如產生10到20間的亂數。

min := 10
max := 20
n := rand.Intn(max-min) + min // n is random int between 10-20
fmt.Println(n)


沒有留言:

張貼留言