如何在 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/