Это реализация функций shuffle и deshuffle. В обоих функциях применяется детерминированный способ генерации случайных чисел на основе xorshift64.
Алгоритм прост: проходимся по нашему массиву с первого до последнего элемента, генерируя случайный индекс на основе числа и делая перестановку местами элементов.
Реализует обратный алгоритм. Проходимся по массиву с последнего элемента до первого, генерируя случайные числа в обратном порядке на основе числа и делая перестановку местами элементов.
#include "shuffle.hpp"
#include <iostream>
#include <vector>
int main() {
std::vector<std::string> vec = { "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10" };
std::uint64_t seed = 1234;
std::cout << "Оригинальный массив: " << "\n";
for (auto &&i : vec)
{
std::cout << i << " ";
} std::cout << std::endl;
shuffle(vec, seed);
std::cout << "Перемешанный массив: " << "\n";
for (auto &&i : vec)
{
std::cout << i << " ";
} std::cout << std::endl;
deshuffle(vec, seed);
std::cout << "Восстановленный в исходном порядке массив: " << "\n";
for (auto &&i : vec)
{
std::cout << i << " ";
} std::cout << std::endl;
return 0;
}
Оригинальный массив:
a1 a2 a3 a4 a5 a6 a7 a8 a9 a10
Перемешанный массив:
a1 a4 a2 a5 a8 a3 a9 a7 a10 a6
Восстановленный в исходном порядке массив:
a1 a2 a3 a4 a5 a6 a7 a8 a9 a10