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

Go 为什么重复相同的随机数?,go,random,Go,Random,我是新手,不知道为什么每次跑步都会打印相同的编号: package main import ( "fmt" "math/rand" ) func main() { fmt.Println(rand.Intn(10)) } 文件说: Intn以int形式从默认源返回[0,n]中的一个非负伪随机数。如果n,它会通过调用函数,向其传递一个(随机)种子(通常是当前unix时间戳)而崩溃。从包文档中引用: 顶级函数(如Float64和Int)使用默认共享源,该源在程序每次

我是新手,不知道为什么每次跑步都会打印相同的编号:

package main

import (
    "fmt"
    "math/rand"
)


func main() {
    fmt.Println(rand.Intn(10)) 
}
文件说:

Intn以int形式从默认源返回[0,n]中的一个非负伪随机数。如果n,它会通过调用函数,向其传递一个(随机)种子(通常是当前unix时间戳)而崩溃。从包文档中引用:

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

例如:

rand.Seed(time.Now().UnixNano())
package main

import (
    "fmt"
    "math/rand"
    "time"
)   

func main() {  
    source := rand.NewSource(time.Now().UnixNano())    
    r := rand.New(source)    
    fmt.Println(r.Intn(100))    
}
如果未调用
rand.Seed()

Seed使用提供的Seed值将默认源初始化为确定性状态。如果未调用Seed,则生成器的行为与Seed(1)的行为相同

在包math/rand下,您可以找到一个类型rand

func New(src Source)*Rand-New返回使用随机变量的新Rand src中的值以生成其他随机值

它实际上需要一颗种子来产生它

  • 步骤1:使用新源创建种子作为源。 time.Now().UnixNano()用于精度
  • 步骤2:创建一个 从种子中键入Rand
  • 步骤3:生成一个随机数
  • 例如:

    rand.Seed(time.Now().UnixNano())
    
    package main
    
    import (
        "fmt"
        "math/rand"
        "time"
    )   
    
    func main() {  
        source := rand.NewSource(time.Now().UnixNano())    
        r := rand.New(source)    
        fmt.Println(r.Intn(100))    
    }
    

    谢谢@icza。那么默认的
    seed
    是一个常量?为什么会存在一个名为“rand”的函数当它不做任何随机操作时,除非调用第二个函数?不希望每次都有一个随机数的用例是什么?例如,为什么默认情况下这两个功能不组合?@lifeofgunter,因为这使您可以重复“重放”相同的伪随机数序列(在操作开始时使用相同的种子)。这是一个有用的属性。不要在每次调用时重新种子设定。