为什么golang重复相同的随机数?

时间:2017-08-18 09:38:03

标签: go random

我是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,则会发生恐慌。

如何正确播种随机数生成?

3 个答案:

答案 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中的值生成其他随机值。

它实际上需要一个种子来生成。

  1. 第1步:使用新来源将种子创建为来源。 time.Now()。UnixNano()用于提高准确性。
  2. 第2步:从种子创建 type Rand
  3. 步骤3:生成随机数。

    包主体

导入

( “ fmt” “数学/ rand” “时间” )
  func main(){

source:= rand.NewSource(time.Now()。UnixNano())

r:= rand.New(源)

fmt.Println(r.Intn(100))

}