C++. Visual Studio 2010.
I have a std::vector V of N unique elements (heavy structs). How can efficiently pick M random, unique, elements from it?
E.g. V contains 10 elements: { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } and I pick three…
- 4, 0, 9
- 0, 7, 8
- But NOT this: 0, 5, 5 <— not unique!
STL is preferred. So, something like this?
std::minstd_rand gen; // linear congruential engine??
std::uniform_int<int> unif(0, v.size() - 1);
gen.seed((unsigned int)time(NULL));
// ...?
// Or is there a good solution using std::random_shuffle for heavy objects?
Create a random permutation of the range
0, 1, ..., N - 1and pick the firstMof them; use those as indices into your original vector.A random permutation is easily made with the standard library by using
std::iotatogether withstd::random_shuffle:You can supply
random_shufflewith a random number generator of your choice; check the documentation for details.