I want to sample three integers among {0, 1, ..., n-1}
without replacement.
Here is how I proceed so far:
#include <random>
/* constructs vector {0, 1, ..., n-1} --------------------------------------- */
template <class T>
std::vector<T> integers_n(T n) {
std::vector<T> out(n);
for(T i = 0; i < n; i++) {
out[i] = i;
}
return out;
}
/* samples three integers among {0, 1, ..., n-1} ---------------------------- */
const std::vector<int> choose3(const int n,
std::default_random_engine& generator) {
std::uniform_int_distribution<int> sampler1(0, n - 1);
std::uniform_int_distribution<int> sampler2(0, n - 2);
std::uniform_int_distribution<int> sampler3(0, n - 3);
const int i1 = sampler1(generator);
const int i2 = sampler2(generator);
const int i3 = sampler3(generator);
std::vector<int> elems = integers_n(n);
elems.erase(elems.begin() + i1);
const int j2 = elems[i2];
elems.erase(elems.begin() + i2);
const int j3 = elems[i3];
return {i1, j2, j3};
}
This works but is there a better way?
I want to perform this sampling multiple times, in a loop. Is it time-consuming to redefine the samplers for each iteration?
For technical reasons, I am restricted to C++ 11.
Aucun commentaire:
Enregistrer un commentaire