random - 如何使用标准库在 Go 中生成*唯一*随机数流

标签 random go

如何在 Go 中生成一个唯一随机数流?

我想使用 math/rand 和/或标准 Go 库实用程序来保证数组 a 中没有重复值。

func RandomNumberGenerator() *rand.Rand {
    s1 := rand.NewSource(time.Now().UnixNano())
    r1 := rand.New(s1)          
    return r1
}
rng := RandomNumberGenerator()    
N := 10000
for i := 0; i < N; i++ {
    a[i] = rng.Int()
}

关于如何在Go中生成一系列随机数的问题和解决方案,例如here .

但我想生成一系列不重复先前值的随机数。在 Go 中是否有标准/推荐的方法来实现这一点?

我的猜测是 (1) 使用排列或 (2) 跟踪先前生成的数字并重新生成一个值(如果之前已生成)。

但是如果我只想要几个数字,解决方案 (1) 听起来有点矫枉过正,如果我最终由于碰撞生成一长串随机数,解决方案 (2) 听起来非常耗时,而且我想这也非常耗费内存.


用例:使用没有重复的 10K、100K、1M 伪随机数对 Go 程序进行基准测试。

最佳答案

您绝对应该采用方法 2。假设您在 64 位机器上运行,因此生成 63 位整数(64 位,但 rand.Int 永远不会返回负数).即使您生成 40 亿个数字,任何给定数字重复的可能性仍然只有 40 亿分之一。因此,您几乎永远不必重新生成,而且几乎永远永远不必重新生成两次。

尝试,例如:

type UniqueRand struct {
    generated map[int]bool
}

func (u *UniqueRand) Int() int {
    for {
        i := rand.Int()
        if !u.generated[i] {
            u.generated[i] = true
            return i
        }
    }
}

关于random - 如何使用标准库在 Go 中生成*唯一*随机数流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39925784/

相关文章:

c - C中的长随机数

c - 在这种情况下如何设置随机矩阵?

random - 在恒定时间内从几何分布中采样

go - 读取 tar 文件的内容而不解压缩到磁盘

python - 从数据存储中获取一个随机实体

python - 使用给定范围内的随机数初始化矩阵 - python

去建立错误: go tool: no such tool “link”

regex - Golang 正则表达式总是返回 false?

Heroku golang 示例应用程序失败

postgresql - 数据库连接在Golang中出错了吗?