7.3. Randomly Shuffling Data
Problem
You have a sequence of data, and you need to jumble it into some random order.
Solution
Use the random_shuffle
standard algorithm, defined
in <algorithm>
. random_shuffle
takes two random-access iterator
s, and (optionally) a random-number generation functor, and
rearranges the elements in the range at random. Example 7-3 shows how to do this.
Example 7-3. Shuffling a sequence at random
#include <iostream> #include <vector> #include <algorithm> #include <iterator> #include "utils.h" // For printContainer(): see 7.10 using namespace std; int main() { vector<int> v; back_insert_iterator<std::vector<int> > p = back_inserter(v); for (int i = 0; i < 10; ++i) *p = i; printContainer(v, true); random_shuffle(v.begin(), v.end()); printContainer(v, true); }
Your output might look like this:
----- 0 1 2 3 4 5 6 7 8 9 ----- 8 1 9 2 0 5 7 3 4 6
Discussion
random_shuffle
is intuitive to use. Give it a
range, and it will shuffle the range at random. There are two versions, and their
prototypes look like this:
void random_shuffle(RndIter first, RndIter last); void random_shuffle(RndIter first, RndIter last, RandFunc& rand);
In the first version, the “random” is using an implementation-specific random-number generation function, which should be sufficient for most of your needs. If it isn’t—perhaps you want a nonuniform distribution, e.g., Gaussian—you can write your own and supply that instead using the second version.
Your random-number generator must be a functor that ...
Get C++ Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.