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,因为这使您可以重复“重放”相同的伪随机数序列(在操作开始时使用相同的种子)。这是一个有用的属性。不要在每次调用时重新种子设定。