diff --git a/include/session/random.hpp b/include/session/random.hpp index 9a37cff8..9968b1e9 100644 --- a/include/session/random.hpp +++ b/include/session/random.hpp @@ -3,6 +3,10 @@ #include #include +#include +#include +#include +#include #include "util.hpp" @@ -75,13 +79,12 @@ std::string unique_id(std::string_view prefix); /// /// Outputs: /// - A random integer in the specified range -template +template T get_uniform_distribution(T min, T max) { if (min > max) return min; - const uint64_t range = static_cast(max) - static_cast(min) + 1; - return static_cast(static_cast(min) + (csrng() % range)); + return std::uniform_int_distribution{min, max}(csrng); } } // namespace session::random diff --git a/tests/test_random.cpp b/tests/test_random.cpp index c02ad515..c571dd74 100644 --- a/tests/test_random.cpp +++ b/tests/test_random.cpp @@ -1,4 +1,6 @@ #include +#include +#include #include "session/random.h" #include "session/random.hpp" @@ -14,3 +16,21 @@ TEST_CASE("Random generation", "[random][random]") { CHECK(rand3.size() == 20); CHECK(rand1 != rand2); } + +TEST_CASE("Random uniform distribution", "[random][uniform]") { + CHECK(session::random::get_uniform_distribution(7, 7) == 7); + CHECK(session::random::get_uniform_distribution(9, 3) == 9); + CHECK_NOTHROW(session::random::get_uniform_distribution( + 0, std::numeric_limits::max())); + CHECK_NOTHROW(session::random::get_uniform_distribution( + std::numeric_limits::min(), std::numeric_limits::max())); + + for (int i = 0; i < 1000; ++i) { + const auto signed_value = session::random::get_uniform_distribution(-5, 5); + CHECK(signed_value >= -5); + CHECK(signed_value <= 5); + + const auto unsigned_value = session::random::get_uniform_distribution(0, 10); + CHECK(unsigned_value <= 10); + } +}