【问题标题】:Generating a random variable in golang using math/rand使用 math/rand 在 golang 中生成随机变量
【发布时间】:2015-05-09 23:03:04
【问题描述】:

我正在尝试为 golang 中的程序模拟掷硬币。我正在尝试使用math/rand,我正在使用time 播种。

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

根据我在这里和在线其他地方查找的内容,我的实现应该可以工作:

func main() {
    var random int
    var i int
    var j int
    for j != 5 && i != 5 {
        rand.Seed(time.Now().UnixNano())
        random = rand.Intn(1)
        if random == 0 {
            i = i + 1
        }
        if random == 1 {
            j = j + 1
        }
    }
fmt.Println(i, j)
}

但是,每次我运行它时,random 总是最终为 0。种子也不会改变,这让我感到困惑。既然在循环中,那么每次播种的时间不应该以纳秒为单位改变吗?

【问题讨论】:

  • 另请注意,Go 操场中的时间不会改变。
  • 请注意,math/rand 生成伪随机数而不是真实随机数。 (...) 这些伪随机数很容易受到许多密码分析攻击 - 就像 PlayStation 发生的事情一样 (en.wikipedia.org/wiki/Random_number_generator_attack)。

标签: random go


【解决方案1】:

不要在循环中重新设置种子,只执行一次。

rand.Intn(n) 返回值 >= 0 和 rand.Intn(1)只能返回0,你想让rand.Intn(2)得到0或者1。

固定代码: http://play.golang.org/p/3D9osMzRRb

【讨论】:

  • 啊啊啊啊谢谢!但为什么我只想播种一次呢?这不会每次都给我相同的结果吗?
  • @agoedken 我认为您不了解seeding 是什么以及为什么这样做。
猜你喜欢
  • 2018-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
相关资源
最近更新 更多