I am making a few wrapper classes for the C++ standard library and was wondering if the following code is good practice.
#pragma once
#include <random>
namespace LibraryName
{
class RandomBase
{
protected:
RandomBase()
: m_RandomGenerator(m_RandomDevice()) {}
std::random_device m_RandomDevice;
std::mt19937 m_RandomGenerator;
};
template<typename T>
class IntRandom : public RandomBase
{
public:
IntRandom(T minValue, T maxValue)
: m_Distribution(minValue, maxValue), m_MinValue(minValue), m_MaxValue(maxValue) {}
T Next()
{
return m_Distribution(m_RandomGenerator);
}
inline T GetMinValue() const { return m_MinValue; }
inline T GetMaxValue() const { return m_MaxValue; }
private:
std::uniform_int_distribution<T> m_Distribution;
T m_MinValue;
T m_MaxValue;
};
template<typename T>
class FloatRandom : public RandomBase
{
public:
FloatRandom(T minValue, T maxValue)
: m_Distribution(minValue, maxValue), m_MinValue(minValue), m_MaxValue(maxValue) {}
T Next()
{
return m_Distribution(m_RandomGenerator);
}
inline T GetMinValue() const { return m_MinValue; }
inline T GetMaxValue() const { return m_MaxValue; }
private:
std::uniform_real_distribution<T> m_Distribution;
T m_MinValue;
T m_MaxValue;
};
class BoolRandom : public RandomBase
{
public:
BoolRandom() : BoolRandom(0.5f) {}
BoolRandom(float trueChance)
: m_Distribution(trueChance), m_TrueChance(trueChance) {}
bool Next()
{
return m_Distribution(m_RandomGenerator);
}
inline bool GetTrueChance() const { return m_TrueChance; }
private:
std::bernoulli_distribution m_Distribution;
float m_TrueChance;
};
}