From e0857552bb6769774c3f1ae37b051d37e11a664b Mon Sep 17 00:00:00 2001 From: Ahmet Inan Date: Sat, 25 Mar 2023 09:56:27 +0100 Subject: [PATCH] added reversible Fisher-Yates shuffle --- permute.hh | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 permute.hh diff --git a/permute.hh b/permute.hh new file mode 100644 index 0000000..988e48e --- /dev/null +++ b/permute.hh @@ -0,0 +1,39 @@ +/* +Reversible permutations + +Copyright 2023 Ahmet Inan +*/ + +#pragma once + +#include "xorshift.hh" + +namespace CODE { + +template +class ReversibleFisherYatesShuffle +{ + int seq[SIZE-1]; +public: + ReversibleFisherYatesShuffle() + { + CODE::Xorshift32 prng; + for (int i = 0; i < SIZE-1; ++i) + seq[i] = i + prng() % (SIZE - i); + } + template + void forward(TYPE *array) + { + for (int i = 0; i < SIZE-1; ++i) + std::swap(array[i], array[seq[i]]); + } + template + void reverse(TYPE *array) + { + for (int i = SIZE-2; i >= 0; --i) + std::swap(array[i], array[seq[i]]); + } +}; + +} +