Daily bit(e) C++. std::shuffle

Добавлено 5 августа 2026 в 08:33

Daily bit(e) C++ 57, случайное перемешивание диапазона элементов с помощью std::shuffle.

Daily bit(e) C++

Когда нам нужно перемешать элементы в случайном порядке, мы можем использовать алгоритм std::shuffle из C++11, который использует генератор случайных чисел в качестве источника случайности.

Можно использовать любой генератор случайных чисел, но для простых случаев обычно достаточно определяемого реализацией std::default_random_engine.

У данного алгоритма есть версия для диапазонов в C++20, но параллельная версия не предоставляется, и поскольку генерация случайных чисел по своей природе является процессом времени выполнения, также нет вариантов constexpr.

#include <random>
#include <algorithm>

std::vector<int> data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};

std::shuffle(
    data.begin(), data.end(), // все элементы
    // источник случайности с заданным начальным значением
    std::default_random_engine(42));
// data == {2, 7, 4, 0, 6, 1, 8, 3, 5, 9} libstdc++
// data == {6, 8, 7, 0, 1, 4, 9, 3, 2, 5} libc++

// Вариант для диапазонов со случайным начальным значением:
std::random_device rd;
std::ranges::shuffle(data,
    std::default_random_engine(rd()));
// data теперь еще раз перемешан

Пример на Compiler Explorer

Теги

C++ / CppDaily bit(e) C++Программирование