Was this page helpful?
Your feedback about this content is important. Let us know what you think.
Additional feedback?
1500 characters remaining
 Important This document may not represent best practices for current development, links to downloads and other resources may no longer be valid. Current recommended version can be found here.

# Predicate Version of random_shuffle

Visual Studio 2005

Illustrates how to use the predicate version of the random_shuffle Standard Template Library (STL) function in Visual C++.

```
template<class RandomAccessIterator, class Predicate> inline
void random_shuffle(
RandomAccessIterator First,
RandomAccessIterator Last,
Predicate Pred
)
```

## Remarks

Note

The class/parameter names in the prototype do not match the version in the header file. Some have been modified to improve readability.

The random_shuffle algorithm shuffles the elements of a sequence [First..Last) in a random order. The predicate version uses the Pred function to generate the indices of the elements to swap. The Pred has to be a function object that takes a parameter n and returns an integral random number in the range 0 - (n - 1). The predicate version of random_shuffle uses operator= to perform swaps.

## Example

```// random_shufflePV.cpp
// compile with: /EHsc
// Illustrates how to use the predicate version
// of the random_shuffle function.
//
// Functions:
//    random_shuffle: Shuffle the elements in a random order.
//
//      Rand: Given n, generates an integral random number in the
//          in the range 0 - (n - 1).
//////////////////////////////////////////////////////////////////////

// disable warning C4786: symbol greater than 255 character,
// okay to ignore
#pragma warning(disable: 4786)

#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>

using namespace std;

// return an integral random number in the range 0 - (n - 1)
int Rand(int n)
{
return rand() % n ;
}

int main()
{
const int VECTOR_SIZE = 8 ;

// Define a template class vector of int
typedef vector<int > IntVector ;

// Define an iterator for template class vector of strings
typedef IntVector::iterator IntVectorIt ;

IntVector Numbers(VECTOR_SIZE) ;

IntVectorIt start, end, it ;

// Initialize vector Numbers
Numbers[0] = 4 ;
Numbers[1] = 10;
Numbers[2] = 70 ;
Numbers[3] = 30 ;
Numbers[4] = 10;
Numbers[5] = 69 ;
Numbers[6] = 96 ;
Numbers[7] = 100;

// location of first element of Numbers
start = Numbers.begin();

// one past the location last element of Numbers
end = Numbers.end();

cout << "Before calling random_shuffle:" << endl;

// print content of Numbers
cout << "Numbers {";
for (it = start; it != end; it++)
cout << " "  << *it;
cout << " }" << endl;

// shuffle the elements in a random order.
// the pointer_to_unary_function adapter converts a function to a
// function object.
random_shuffle(start, end, pointer_to_unary_function<int, int>(Rand));

cout << "After calling random_shuffle:" << endl;

cout << "Numbers {";
for (it = start; it != end; it++)
cout << " " << *it;
cout << " }" << endl;
}
```

## Output

```Before calling random_shuffle:
Numbers { 4 10 70 30 10 69 96 100 }
After calling random_shuffle:
Numbers { 10 10 96 70 4 69 100 30 }```

## Requirements

Header: <algorithm>

## See Also

#### Concepts

Standard Template Library Samples

ADD
Show:
© 2015 Microsoft