Namespaces
Variants

std::ranges:: shuffle

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Constrained algorithms
All names in this menu belong to namespace std::ranges
Non-modifying sequence operations
Modifying sequence operations
Partitioning operations
Sorting operations
Binary search operations (on sorted ranges)
Set operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Permutation operations
Fold operations
Operations on uninitialized storage
Return types
Definido en el encabezado <algorithm>
Firma de llamada
template < std:: random_access_iterator I, std:: sentinel_for < I > S, class Gen >

requires std:: permutable < I > &&
std:: uniform_random_bit_generator < std:: remove_reference_t < Gen >>

I shuffle ( I first, S last, Gen && gen ) ;
(1) (desde C++20)
(2) (desde C++20)
1) Reordena los elementos en el rango dado [ first , last ) de tal forma que cada posible permutación de esos elementos tenga igual probabilidad de aparición.
2) Igual que (1) , pero utiliza r como el rango, como si usara ranges:: begin ( r ) como first y ranges:: end ( r ) como last .

Las entidades similares a funciones descritas en esta página son algorithm function objects (conocidas informalmente como niebloids ), es decir:

Contenidos

Parámetros

first, last - el par iterador-centinela que define el rango de elementos a barajar aleatoriamente
r - el rango de elementos a barajar aleatoriamente
gen - el generador de números aleatorios

Valor de retorno

Un iterador igual a last .

Complejidad

Exactamente ( last - first ) - 1 intercambios.

Implementación posible

struct shuffle_fn
{
    template<std::random_access_iterator I, std::sentinel_for<I> S, class Gen>
    requires std::permutable<I> &&
             std::uniform_random_bit_generator<std::remove_reference_t<Gen>>
    I operator()(I first, S last, Gen&& gen) const
    {
        using diff_t = std::iter_difference_t<I>;
        using distr_t = std::uniform_int_distribution<diff_t>;
        using param_t = typename distr_t::param_type;
        distr_t D;
        const auto n {last - first};
        for (diff_t i {1}; i < n; ++i)
            ranges::iter_swap(first + i, first + D(gen, param_t(0, i)));
        return ranges::next(first, last);
    }
    template<ranges::random_access_range R, class Gen>
    requires std::permutable<ranges::iterator_t<R>> &&
             std::uniform_random_bit_generator<std::remove_reference_t<Gen>>
    ranges::borrowed_iterator_t<R> operator()(R&& r, Gen&& gen) const
    {
        return (*this)(ranges::begin(r), ranges::end(r), std::forward<Gen>(gen));
    }
};
inline constexpr shuffle_fn shuffle {};

Ejemplo

#include <algorithm>
#include <array>
#include <iostream>
#include <random>
void print(const auto& a)
{
    for (const auto e : a)
        std::cout << e << ' ';
    std::cout << '\n';
}
int main()
{
    std::array a {'A', 'B', 'C', 'D', 'E', 'F'};
    print(a);
    std::random_device rd;
    std::mt19937 gen {rd()};
    for (int i {}; i != 3; ++i)
    {
        std::ranges::shuffle(a, gen);
        print(a);
    }
}

Salida posible:

A B C D E F
F E A C D B
E C B F A D
B A E C F D

Véase también

genera la siguiente permutación lexicográfica mayor de un rango de elementos
(objeto función de algoritmo)
genera la siguiente permutación lexicográfica menor de un rango de elementos
(objeto función de algoritmo)
(until C++17) (C++11)
reordena aleatoriamente elementos en un rango
(plantilla de función)