从STL范围中获取[伪]随机元素的好方法是什么?
我能想到的最好的办法是从中std::random_shuffle(c.begin(), c.end())取出我的随机元素c.begin()。
std::random_shuffle(c.begin(), c.end())
c.begin()
但是,我可能想要const容器中的随机元素,或者我可能不希望花费全部费用。
const
有没有更好的办法?
我在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());
我最终按照类似的方法创建了一个具有更好设计的要点。