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

mjl*_*wky 3 random go

我是新手rand.Intn(n int) int,不知道为什么它rand.Intn(n int) int为每次运行打印相同的数字:

package main

import (
    "fmt"
    "math/rand"
)


func main() {
    fmt.Println(rand.Intn(10)) 
}
Run Code Online (Sandbox Code Playgroud)

文档说:

Intn从默认Source返回[0,n]中的非负伪随机数作为int.如果n <= 0则会发生恐慌.

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

icz*_*cza 8

通过调用该rand.Seed()函数,传递一个(随机)种子(通常是当前的unix时间戳).从math/rand包doc 引用:

顶级函数(如Float64和Int)使用默认的共享源,每次运行程序时都会生成确定的值序列.如果每次运行需要不同的行为,请使用Seed函数初始化默认Source.

例:

rand.Seed(time.Now().UnixNano())
Run Code Online (Sandbox Code Playgroud)

如果rand.Seed()未调用,则生成器的行为就像是由1播种的:

Seed使用提供的种子值将默认Source初始化为确定性状态.如果未调用Seed,则生成器的行为就像Seed(1)播种一样.

  • 为什么会存在一个名为“rand”的函数,当它不执行任何随机操作时,除非正在调用第二个函数?不希望每次都有随机数的用例是什么?例如,为什么默认情况下不合并这两种功能? (3认同)
  • @lifeofguenter因为这使您可以重复,“重放”相同的伪随机数字序列(通过在操作开始时使用相同的种子)。这是一个有用的属性。 (3认同)