std::random_shuffle, std::shuffle

Header: <algorithm>

Reorders the elements in the given range [first,last) such that each possible permutation of those elements has equal probability of appearance.

# Declarations

template< class RandomIt >
void random_shuffle( RandomIt first, RandomIt last );

(deprecated in C++14) (removed in C++17)

template< class RandomIt, class RandomFunc >
void random_shuffle( RandomIt first, RandomIt last, RandomFunc& r );

(until C++11)

template< class RandomIt, class RandomFunc >
void random_shuffle( RandomIt first, RandomIt last, RandomFunc&& r );

(since C++11) (deprecated in C++14) (removed in C++17)

template< class RandomIt, class URBG >
void shuffle( RandomIt first, RandomIt last, URBG&& g );

(since C++11)

# Parameters

# Notes

Note that the implementation is not dictated by the standard, so even if you use exactly the same RandomFunc or URBG (Uniform Random Number Generator) you may get different results with different standard library implementations.

The reason for removing std::random_shuffle in C++17 is that the iterator-only version usually depends on std::rand, which is now also discussed for deprecation. (std::rand should be replaced with the classes of the header, as std::rand is considered harmful.) In addition, the iterator-only std::random_shuffle version usually depends on a global state. The std::shuffle’s shuffle algorithm is the preferred replacement, as it uses a URBG as its 3rd parameter.

# Example

#include <algorithm>
#include <iostream>
#include <iterator>
#include <random>
#include <vector>
 
int main()
{
    std::vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
 
    std::random_device rd;
    std::mt19937 g(rd());
 
    std::shuffle(v.begin(), v.end(), g);
 
    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';
}

# Defect reports

DRApplied toBehavior as publishedCorrect behavior
LWG 395C++98the source of randomness of overload (1) was not specified, andstd::rand could not be the source due to the C library requirementit is implementation-defined,and using std::rand is allowed
LWG 552(N2423)C++98r was not required to be the sourceof randomness of overload (2)[1]required

# See also