Library: Algorithms
Function
Algorithm that randomly shuffles elements of a collection
#include <algorithm>
namespace std {
template <class RandomAccessIterator>
void random_shuffle(RandomAccessIterator start,
RandomAccessIterator finish);
template <class RandomAccessIterator,
class RandomNumberGenerator>
void random_shuffle(RandomAccessIterator start,
RandomAccessIterator finish,
RandomNumberGenerator& rand);
}
The random_shuffle() algorithm shuffles the elements in the range [start, finish) with uniform distribution. random_shuffle() can take a particular random number generating function object rand (where rand takes a positive argument n of type convertible from std::iterator_traits<RandomAccessIterator>::difference_type) and returns a randomly chosen value between 0 and n - 1.
In the random_shuffle() algorithm, (finish - start) - 1 swaps are done.
//
// rndshufl.cpp
//
#include <algorithm> // for random_shuffle
#include <iostream> // for cout, endl
#include <iterator> // for ostream_iterator
#include <string> // for string
int main ()
{
// Create a string of doubles (unusual? maybe,
// but why not...)
typedef std::basic_string<double,
std::char_traits<double>,
std::allocator<double> >
Bizarre;
// Initialize a Bizarre with an array of values.
const Bizarre::value_type a[] = { 1, 2, 3, 4, 5,
6, 7, 8, 9, 10 };
Bizarre b (a + 0, a + sizeof a / sizeof *a);
typedef std::ostream_iterator<double, char,
std::char_traits<char> >
Iter;
// Suppress decimal point in output.
std::cout.precision (0);
// Print out elements in original (sorted) order.
std::cout << "Elements before random_shuffle: \n ";
std::copy (b.begin (), b.end (), Iter (std::cout," "));
// Mix them up with random_shuffle.
std::random_shuffle (b.begin (), b.end ());
// Print out the mixed up elements.
std::cout << "\n\nElements after random_shuffle: \n ";
std::copy (b.begin (), b.end (), Iter (std::cout, " "));
std::cout << std::endl;
return 0;
}
Program Output:
Elements before random_shuffle:
1 2 3 4 5 6 7 8 9 10
Elements after random_shuffle:
9 8 7 6 2 3 1 4 5 10
ISO/IEC 14882:1998 -- International Standard for Information Systems --Programming Language C++, Section 25.2.11