GSP
Quick Navigator

Search Site

Unix VPS
A - Starter
B - Basic
C - Preferred
D - Commercial
MPS - Dedicated
Previous VPSs
* Sign Up! *

Support
Contact Us
Online Help
Handbooks
Domain Status
Man Pages

FAQ
Virtual Servers
Pricing
Billing
Technical

Network
Facilities
Connectivity
Topology Map

Miscellaneous
Server Agreement
Year 2038
Credits
 

USA Flag

 

 

Man Pages
std::random_shuffle,std::shuffle(3) C++ Standard Libary std::random_shuffle,std::shuffle(3)

std::random_shuffle,std::shuffle - std::random_shuffle,std::shuffle


Defined in header <algorithm>
template< class RandomIt > (deprecated in C++14)
void random_shuffle( RandomIt first, (1) (removed in C++17)
RandomIt last );
template< class RandomIt, class
RandomFunc > (until C++11)
void random_shuffle( RandomIt first,
RandomIt last, RandomFunc& r );
template< class RandomIt, class (since C++11)
RandomFunc > (2) (deprecated in C++14)
void random_shuffle( RandomIt first, (removed in C++17)
RandomIt last, RandomFunc&& r );
template< class RandomIt, class URBG
> (3) (since C++11)
void shuffle( RandomIt first,
RandomIt last, URBG&& g );


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


1) The random number generator is implementation-defined, but the function std::rand
is often used.
2) The random number generator is the function object r.
3) The random number generator is the function object g.


first, last - the range of elements to shuffle randomly
function object returning a randomly chosen value of type convertible
r - to std::iterator_traits<RandomIt>::difference_type in the interval
[0,n) if invoked as r(n)
g - a UniformRandomBitGenerator whose result type is convertible to
std::iterator_traits<RandomIt>::difference_type


-
RandomIt must meet the requirements of ValueSwappable and
LegacyRandomAccessIterator.
-
std::remove_reference_t<URBG> must meet the requirements of
UniformRandomBitGenerator.


(none)


Linear in the distance between first and last.


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 <random> 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.


See also the implementations in libstdc++ and libc++.


template< class RandomIt >
void random_shuffle( RandomIt first, RandomIt last )
{
typename std::iterator_traits<RandomIt>::difference_type i, n;
n = last - first;
for (i = n-1; i > 0; --i) {
using std::swap;
swap(first[i], first[std::rand() % (i+1)]);
// rand() % (i+1) isn't actually correct, because the generated number
// is not uniformly distributed for most values of i. A correct implementation
// will need to essentially reimplement C++11 std::uniform_int_distribution,
// which is beyond the scope of this example.
}
}


template<class RandomIt, class RandomFunc>
void random_shuffle(RandomIt first, RandomIt last, RandomFunc&& r)
{
typename std::iterator_traits<RandomIt>::difference_type i, n;
n = last - first;
for (i = n-1; i > 0; --i) {
using std::swap;
swap(first[i], first[r(i+1)]);
}
}
Third version
template<class RandomIt, class URBG>
void shuffle(RandomIt first, RandomIt last, URBG&& g)
{
typedef typename std::iterator_traits<RandomIt>::difference_type diff_t;
typedef std::uniform_int_distribution<diff_t> distr_t;
typedef typename distr_t::param_type param_t;


distr_t D;
diff_t n = last - first;
for (diff_t i = n-1; i > 0; --i) {
using std::swap;
swap(first[i], first[D(g, param_t(0, i))]);
}
}


The following code randomly shuffles the integers 1..10:

// Run this code


#include <random>
#include <algorithm>
#include <iterator>
#include <iostream>
#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";
}


8 6 10 4 2 3 7 1 9 5


generates the next greater lexicographic permutation of a range of
next_permutation elements
(function template)
generates the next smaller lexicographic permutation of a range of
prev_permutation elements
(function template)
ranges::shuffle randomly re-orders elements in a range
(C++20) (niebloid)

2022.07.31 http://cppreference.com

Search for    or go to Top of page |  Section 3 |  Main Index

Powered by GSP Visit the GSP FreeBSD Man Page Interface.
Output converted with ManDoc.