【问题标题】:Difficulty with Go Rand packageGo Rand 包的难度
【发布时间】:2012-10-10 23:45:19
【问题描述】:

是否有任何 Go 函数在每次运行时都返回真正的伪随机数?我的意思是,考虑下面的代码,

package main

import (
    "fmt"
    "rand"
)

func main() {
    fmt.Println(rand.Int31n(100))
}

每次执行此代码时,我都会得到相同的输出。是否有一种方法会在每次调用时返回不同的随机结果?

【问题讨论】:

    标签: go


    【解决方案1】:

    rand可用于生成伪随机数,这些伪随机数是根据特定的初始值(称为“种子”)生成的。

    这个初始种子的一个流行选择是例如以纳秒为单位的当前时间 - 当您多次执行程序时,这个值可能会有所不同。您可以使用当前时间初始化随机生成器,如下所示:

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

    (不要忘记为此导入 time 包)

    还有另一个名为crypto/rand 的包可用于生成更好的随机值(此生成器可能还会考虑用户的鼠标移动、处理器的当前热量和许多其他因素)。但是,这个包中的功能要慢几倍,除非你不编写密码短语生成器(或其他与安全相关的东西),否则普通的 rand 包可能没问题。

    【讨论】:

    • plain rand 的另一个有用属性是您可以通过重用种子来重现您的结果。
    • 用 go1 time.Nanoseconds() 似乎不存在。你可以使用 rand.Seed(time.Now().UnixNano())
    【解决方案2】:

    你必须先播种 RNG。

    我没用过 Go,不过应该是rand.Seed(x);

    【讨论】:

    • 你的意思是,package main import "fmt" import "rand" func main() { rand.Seed(100); fmt.Println(rand.Int31n(100)) }。它在整个运行过程中也提供相同的输出。
    • 那是因为你用静态数字 100 播种它:-) 尝试使用更独特的东西,例如以毫秒为单位的当前时间。
    【解决方案3】:

    rand.Seed(time.Now().UnixNano()) 在 Ubuntu 上工作。我一直在研究rand.Seed(time.Nanoseconds())。我终于在 golang tour 上找到了 Example: Google Search 2.1。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多