【问题标题】:Randomly selecting N distinct numbers without repetition [duplicate]随机选择N个不同的数字而不重复[重复]
【发布时间】:2013-04-23 04:24:16
【问题描述】:

我想从 {1,2,...(k-1),K} 中随机选择 N 个不同的数字,其中 K>N。我想编写一个 C 程序来有效地做到这一点。

任何帮助表示赞赏。

注意:

朴素的程序只是生成随机数,检查它是否已经生成,如果没有将其添加到列表中,很容易实现。我一直在寻找更有效的东西,好像 K 和 N 是可比的,那么这将只是低效的计算。

【问题讨论】:

标签: c algorithm random


【解决方案1】:

当 K 和 N 相当时,使用Knuth shuffle,但将随机播放限制为仅 N 次。

注意,如果不是,这可能会浪费大量内存。

【讨论】:

  • 你可以只洗牌一次并拿起前 N 个项目,对吧? Knuth Shuffle 是 K 中的线性时间和内存。
  • @anoopelias 谢谢,我把 K 作为 OP 想要的元素数。
【解决方案2】:

Reservoir sampling 是一系列随机算法,用于从包含 n 个项目的列表 S 中随机选择 k 个样本,其中 n 是一个非常大或未知的数字。”

(请注意,关于您的问题,该维基百科页面上 K 和 N 的角色是相反的)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2020-02-19
    • 2011-08-11
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多