diff --git a/shm/CMakeLists.txt b/shm/CMakeLists.txt index 06f0a396f..63e0b023e 100644 --- a/shm/CMakeLists.txt +++ b/shm/CMakeLists.txt @@ -10,6 +10,7 @@ project(SHM) # set executables set(THIS_PROJECT_SRC_DIRECTORIES + source/Fortune.cpp source/Map.cpp ) set(THIS_PROJECT_TESTS_DIRECTORIES diff --git a/shm/source/Fortune.cpp b/shm/source/Fortune.cpp new file mode 100644 index 000000000..6376f62e4 --- /dev/null +++ b/shm/source/Fortune.cpp @@ -0,0 +1,32 @@ +#include "Fortune.hpp" + +std::random_device randomDevice; +std::mt19937 randomEngine(randomDevice()); + +int Fortune::getNumber(int first, int last) { + if (first > last) { + std::swap(first, last); + } + std::uniform_int_distribution distribution(first, last); + return distribution(randomEngine); +} + +std::vector Fortune::getNumbersEvenlyDistributed(int first, int last, const int n) { + if (n < 1) { + return {}; + } + if (first > last) { + std::swap(first, last); + } + std::vector result(n); + for (int i = 0; i < n; ++i) { + int localFirst = (last / n * i) + first; + int localLast = (last / n * (i + 1)) + first; + result.at(i) = (getNumber(localFirst, localLast)); + } + return result; +} + +void Fortune::shuffle(std::vector& vector) { + std::shuffle(vector.begin(), vector.end(), randomEngine); +} diff --git a/shm/source/Fortune.hpp b/shm/source/Fortune.hpp index 6ece6a8d6..df5252ae6 100644 --- a/shm/source/Fortune.hpp +++ b/shm/source/Fortune.hpp @@ -1,42 +1,10 @@ #pragma once -#include +#include #include -#include #include -struct Fortune { - static int getNumber(int first, int last) { - const int result = makeRandomNumber(first, last); - if (result < first || result > last) { - throw std::logic_error("Fortune::getNumber(int,int): Result value out of scope"); - } - return result; - } - - static std::vector getNumbersEvenlyDistributed(int first, int last, const int n) { - if (n < 1) { - return {}; - } - std::vector result(n); - for (int i = 0; i < n; ++i) { - int localFirst = (last / n * i) + first; - int localLast = (last / n * (i + 1)) + first; - result.at(i) = (getNumber(localFirst, localLast)); - } - return result; - } - - static void shuffle(std::vector& vector) { - std::random_device random_device; - std::mt19937 random_engine(random_device()); - std::shuffle(vector.begin(), vector.end(), random_engine); - } - -private: - static int makeRandomNumber(const int first, const int last) { - std::random_device random_device; - std::mt19937 random_engine(random_device()); - std::uniform_int_distribution distribution(first, last); - return distribution(random_engine); - } -}; \ No newline at end of file +namespace Fortune { + int getNumber(int first, int last); + std::vector getNumbersEvenlyDistributed(int first, int last, const int n); + void shuffle(std::vector& vector); +} \ No newline at end of file