例如,尝试运行这段代码,它引入了rand.Intn(n)
,它返回一个介于0
和之间的随机数n - 1
。
package main
import (
"fmt"
"math/rand"
)
func main() {
fmt.Println(rand.Intn(30))
fmt.Println(rand.Intn(30))
fmt.Println(rand.Intn(30))
fmt.Println(rand.Intn(30))
fmt.Println(rand.Intn(30))
}
每次运行程序时,您总是会看到相同的序列。程序内部的随机数会发生变化,但是每次运行它时,您都会得到相同的输出:
11
27
17
29
1
这是因为默认情况下,种子总是相同的,即 number 1
。要真正获得一个随机数,您需要为您的程序提供一个唯一的种子。你真的不想忘记播种,而是正确地播种我们的伪数生成器。如何?
rand.Seed()
在调用任何math/rand
方法之前使用,传递一个int64
值。您只需要在程序中播种一次,而不是每次都需要随机数时。最常用的种子是当前时间,转换成int64
由UnixNano用rand.Seed(time.Now().UnixNano())
:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
fmt.Println(rand.Intn(30))
fmt.Println(rand.Intn(30))
fmt.Println(rand.Intn(30))
fmt.Println(rand.Intn(30))
fmt.Println(rand.Intn(30))
}
为了便于重用,下面列出了一些常见示例:
生成一个随机整数
package main
import (
"fmt"
"math/rand"
"time"
)
// Returns an int >= min, < max
func randomInt(min, max int) int {
return min + rand.Intn(max-min)
}
func main() {
rand.Seed(time.Now().UnixNano())
fmt.Println(randomInt(1, 11)) //get an int in the 1...10 range
}