一尘不染

随机选择一组不同整数的最有效方法

algorithm

我正在寻找最有效的算法,以随机选择一组n个不同的整数,其中所有整数均在[0..maxValue]范围内。

限制条件:

  • maxValue大于n,并且可能更大
  • 我不在乎输出列表是否已排序
  • 必须以相等的概率选择所有整数

我最初的想法是构造一个整数[0..maxValue]的列表,然后随机提取n个元素而无需替换。但这似乎效率很低,尤其是在maxValue大的情况下。

有更好的解决方案吗?


阅读 234

收藏
2020-07-28

共1个答案

一尘不染

对于较小的maxValue值,这样可以合理地在内存中生成所有整数的数组,则可以使用Fisher-
Yates随机播放
的变体,但仅执行n第一步即可。


如果n小于,maxValue并且您不希望生成整个数组,则可以使用以下算法:

  1. 保留l到目前为止选择的数字排序列表,最初是空的。
  2. 选择一个x介于0到maxValue- 之间的随机数(元素为l
  3. 对于l其中小于或等于的每个数字x,将1加到x
  4. 将调整后的值添加x到已排序的列表中并重复。

如果n非常接近,maxValue则可以随机选择结果 中未 包含的元素,然后找到该集合的补数。


这是另一个更简单的算法,但是执行时间可能不受限制:

  1. s到目前为止,请保留一组选择的元素,最初是空的。
  2. 随机选择一个介于0到之间的数字maxValue
  3. 如果号码不在s,请将其添加到s
  4. 返回步骤2,直到s具有n元素。

实际上,如果n大小较小,maxValue则对于大多数目的来说已经足够了。

2020-07-28