一尘不染

如何从C ++容器中获取随机元素?

algorithm

从STL范围中获取[伪]随机元素的好方法是什么?

我能想到的最好的办法是从中std::random_shuffle(c.begin(), c.end())取出我的随机元素c.begin()

但是,我可能想要const容器中的随机元素,或者我可能不希望花费全部费用。

有没有更好的办法?


阅读 218

收藏
2020-07-28

共1个答案

一尘不染

我在Google+上的一篇文章中发布了该解决方案,其他人对此进行了引用。将其发布在此处,因为它比其他版本稍好一点,因为它通过使用std ::
uniform_int_distribution避免了偏见:

#include  <random>
#include  <iterator>

template<typename Iter, typename RandomGenerator>
Iter select_randomly(Iter start, Iter end, RandomGenerator& g) {
    std::uniform_int_distribution<> dis(0, std::distance(start, end) - 1);
    std::advance(start, dis(g));
    return start;
}

template<typename Iter>
Iter select_randomly(Iter start, Iter end) {
    static std::random_device rd;
    static std::mt19937 gen(rd());
    return select_randomly(start, end, gen);
}

样本用法为:

#include <vector>
using namespace std;

vector<int> foo;
/* .... */
int r = *select_randomly(foo.begin(), foo.end());

我最终按照类似的方法创建了一个具有更好设计要点

2020-07-28