diff --git a/libtransmission/crypto-utils.cc b/libtransmission/crypto-utils.cc index 232a25459..e5c004527 100644 --- a/libtransmission/crypto-utils.cc +++ b/libtransmission/crypto-utils.cc @@ -7,8 +7,8 @@ */ #include -#include /* abs(), srand(), rand() */ #include /* memcpy(), memmove(), memset(), strcmp(), strlen() */ +#include /* random_device, mt19937, uniform_int_distribution*/ #include @@ -106,15 +106,12 @@ int tr_rand_int_weak(int upper_bound) { TR_ASSERT(upper_bound > 0); - static bool init = false; + thread_local auto random_engine = std::mt19937{ std::random_device{}() }; + using distribution_type = std::uniform_int_distribution<>; + thread_local distribution_type distribution; - if (!init) - { - srand(tr_time_msec()); - init = true; - } - - return rand() % upper_bound; + // Upper bound is inclusive in std::uniform_int_distribution. + return distribution(random_engine, distribution_type::param_type{ 0, upper_bound - 1 }); } /***