说我有y不同的价值观,我想x随机选择它们。有什么有效的算法可以做到这一点?我可以打电话rand() x,但是如果很大x,性能会很差y。
y
x
rand()
请注意,这里需要 组合 :每个值应具有相同的概率被选择,但是它们在结果中的顺序并不重要。当然,任何生成置换的算法都符合条件,但我想知道是否有可能在没有随机顺序要求的情况下更有效地做到这一点。
RobertFloyd为此发明了一种采样算法。x由于不需要O(y)存储,因此通常比改组然后抓取第一个元素更好。如最初所写,它假定值从1..N开始,但是通过简单地将其产生的值作为下标处理到向量/数组/任何对象中,产生0..N和/或使用非连续值是微不足道的。
在pseuocode中,算法的运行方式是这样的(从Jon Bentley的 Programming Pearls 专栏“ Brillance of Brilliance”中窃取)。
initialize set S to empty for J := N-M + 1 to N do T := RandInt(1, J) if T is not in S then insert T in S else insert J in S
最后一点(如果T已经在S中,则插入J)是棘手的部分。最重要的是,它确保了插入J的正确数学概率,从而产生了无偏结果。
关于 O(x) 存储,它是 O(x) 1和 O(1) 。y __
请注意,根据问题中的组合标签,该算法仅保证结果中每个元素出现的概率相等,而不保证它们在其中的相对顺序。
在涉及的哈希图的最坏情况下为1 O(x2),可以忽略不计,因为这实际上是一种不存在的病理情况,其中所有值都具有相同的哈希值