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)
沒有留言:
張貼留言