我是golang
的新手,不知道为什么每次运行都为rand.Intn(n int) int
打印相同的数字:
package main
import (
"fmt"
"math/rand"
)
func main() {
fmt.Println(rand.Intn(10))
}
文档说:
Intn以默认Source的形式返回[0,n]中的非负伪随机数作为int。如果n <= 0,则会发生恐慌。
如何正确播种随机数生成?
答案 0 :(得分:8)
通过调用rand.Seed()
函数,向其传递(随机)种子(通常是当前的unix时间戳)。引自math/rand
包doc:
顶级函数(如Float64和Int)使用默认的共享源,每次运行程序时都会生成一个确定的值序列。如果每次运行需要不同的行为,请使用Seed函数初始化默认Source。
示例:
rand.Seed(time.Now().UnixNano())
如果未调用rand.Seed()
,则生成器的行为就像是播种1:
Seed使用提供的种子值将默认Source初始化为确定性状态。如果未调用Seed,则生成器的行为就像种子(1)播种一样。
答案 1 :(得分:1)
package main
import
(
"fmt"
"math/rand"
"time"
)
func randomGen(min, max int) int {
rand.Seed(time.Now().Unix())
return rand.Intn(max - min) + min
}
func main() {
randNum := randomGen(1, 10)
fmt.Println(randNum)
}
答案 2 :(得分:0)
在软件包 math / rand 下,您可以找到类型Rand 。
func New(src Source)* Rand-New返回使用随机值的新Rand src中的值生成其他随机值。
它实际上需要一个种子来生成。
步骤3:生成随机数。
包主体
导入
(
“ fmt”
“数学/ rand”
“时间”
)
func main(){
source:= rand.NewSource(time.Now()。UnixNano())
r:= rand.New(源)
fmt.Println(r.Intn(100))
}