从一组中选择N个随机数

时间:2010-10-04 20:40:56

标签: c++ random set

我有一个排序集(std :: set为精确),其中包含具有指定权重的元素。我想从这个集合中随机选择N个元素,而权重较高的元素应该有更大的被选择概率。任何元素都可以多次选择。

我想尽可能高效地执行此操作 - 我希望避免任何复制集合(可能会变得非常大)并且如果可能的话在O(N)时间运行。我正在使用C ++,并希望坚持使用STL + Boost解决方案。

有人知道STL / Boost中是否有执行此任务的功能?如果没有,如何实施一个?

3 个答案:

答案 0 :(得分:3)

您需要计算(并且可能缓存,如果您考虑性能)您集合中所有权重的总和。然后,生成范围高达该值的N个随机数。最后,迭代你的集合,计算你到目前为止遇到的权重之和。检查所有(剩余的)随机数。如果数字落在总和的上一个值和下一个值之间,请插入集合中的值并删除随机数。当您的随机数列表为空或者您已到达集合的末尾时停止。

答案 1 :(得分:2)

我不知道任何图书馆,但听起来你有一个加权轮盘赌轮。这里是一些伪代码的参考,尽管上下文与遗传算法有关:http://www.cse.unr.edu/~banerjee/selection.htm

至于“尽可能有效”,这取决于数据的某些特征。在加权轮盘赌轮的应用中,当搜索索引时,您可以考虑使用二进制搜索。然而,并非轮盘赌轮的每个槽都具有相同的可能性,因此按重量顺序检查它们是有意义的。

答案 2 :(得分:1)

很大程度上取决于您愿意花费多少额外存储空间来进行选择。

如果您不愿意使用任何额外的存储空间,@ Alex Emelianov的回答几乎就是我想要发布的内容。如果你愿意使用一些额外的存储空间(可能是一个不同于std::set的数据结构),你可以创建一个树(就像一个集合使用),但是在树的每个节点,你也可以存储(加权) )该节点左侧的项目数。这将允许您从生成的数字映射到具有对数(而不是线性)复杂性的正确关联值。