From 02bac59cb8c83b367d8ae659513c437f4f56b8c9 Mon Sep 17 00:00:00 2001 From: SupSuper Date: Wed, 14 Oct 2020 12:15:26 +0100 Subject: [PATCH] Make shuffle deterministic --- src/Engine/RNG.cpp | 11 ----------- src/Engine/RNG.h | 10 ++++++---- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/src/Engine/RNG.cpp b/src/Engine/RNG.cpp index c0dd7db7bc..e74614b2c6 100644 --- a/src/Engine/RNG.cpp +++ b/src/Engine/RNG.cpp @@ -152,17 +152,6 @@ bool percent(int value) return (generate(0, 99) < value); } -/** - * Generates a random positive integer up to a number. - * @param max Maximum number, exclusive. - * @return Generated number. - */ -int generateEx(int max) -{ - uint64_t num = next(); - return (int)(num % max); -} - } } diff --git a/src/Engine/RNG.h b/src/Engine/RNG.h index b9af0783e6..349b4e760c 100644 --- a/src/Engine/RNG.h +++ b/src/Engine/RNG.h @@ -18,6 +18,7 @@ * along with OpenXcom. If not, see . */ #include +#include #define __STDC_LIMIT_MACROS #include @@ -45,17 +46,18 @@ namespace RNG double boxMuller(double m = 0, double s = 1); /// Generates a percentage chance. bool percent(int value); - /// Generates a random integer number, exclusive. - int generateEx(int max); /// Shuffles a list randomly. /** * Randomly changes the orders of the elements in a list. * @param list The container to randomize. */ template - void shuffle(T &list) + void shuffle(std::vector &list) { - std::random_shuffle(list.begin(), list.end(), generateEx); + if (list.empty()) + return; + for (size_t i = list.size() - 1; i > 0; --i) + std::swap(list[i], list[generate(0, i)]); } }