
Untitled
By: a guest on
Apr 28th, 2012 | syntax:
None | size: 0.80 KB | hits: 14 | expires: Never
Choose m elements randomly from a vector containing n elements
template<class fwditer>
bidiiter random_unique(fwditer begin, fwditer end, size_t num_random) {
size_t left = std::distance(begin, end);
while (num_random--) {
fwditer r = begin;
std::advance(r, rand()%left);
std::swap(*begin, *r);
++begin;
--left;
}
return begin;
}
struct rangegenerator {
rangegenerator(int init) : start(init) { }
int operator()() {
return start++;
}
int start;
};
vector<T> numbers; // this is filled somewhere else
vector<int> indices(numbers.size());
generate(begin(indices), end(indices), rangegenerator(0));
random_shuffle(begin(indices), end(indices));
// then take the first n elements of indices and use them as indices into numbers