dncurrency/nano/lib/random.hpp
2024-10-30 18:42:37 +01:00

60 lines
No EOL
1.2 KiB
C++

#pragma once
#include <mutex>
#include <random>
namespace nano
{
/**
* Not safe for any crypto related code, use for non-crypto PRNG only.
*/
class random_generator final
{
public:
/// Generate a random number in the range [min, max)
auto random (auto min, auto max)
{
release_assert (min < max);
std::uniform_int_distribution<decltype (min)> dist (min, max - 1);
return dist (rng);
}
/// Generate a random number in the range [0, max)
auto random (auto max)
{
return random (decltype (max){ 0 }, max);
}
private:
std::random_device device;
std::default_random_engine rng{ device () };
};
/**
* Not safe for any crypto related code, use for non-crypto PRNG only.
* Thread safe.
*/
class random_generator_mt final
{
public:
/// Generate a random number in the range [min, max)
auto random (auto min, auto max)
{
release_assert (min < max);
std::lock_guard<std::mutex> lock{ mutex };
std::uniform_int_distribution<decltype (min)> dist (min, max - 1);
return dist (rng);
}
/// Generate a random number in the range [0, max)
auto random (auto max)
{
return random (decltype (max){ 0 }, max);
}
private:
std::random_device device;
std::default_random_engine rng{ device () };
std::mutex mutex;
};
}