OmniaFramework/Release/include/ostd/Random.hpp
2023-12-28 01:33:40 +01:00

81 lines
3.7 KiB
C++

#ifndef __RANDOM_HPP__
#define __RANDOM_HPP__
#include <random>
#include <climits>
#include <ostd/Geometry.hpp>
#include <ostd/vendor/FastNoiseLite.hpp>
namespace ostd
{
class RandomGenerator
{
public:
inline RandomGenerator(bool auto_seed = true) { if (auto_seed) autoSeed(); }
inline RandomGenerator(int64_t _seed) { seed(_seed); }
void seed(int64_t _seed);
void autoSeed(void);
int64_t getSeed(void);
float getf32(float min = 0.0f, float max = 1.0f);
double getf64(double min = 0.0f, double max = 1.0f);
int64_t geti64(int64_t min = LLONG_MIN, int64_t max = LLONG_MAX);
int32_t geti32(int32_t min = INT_MIN, int32_t max = INT_MAX);
int16_t geti16(int16_t min = SHRT_MIN, int16_t max = SHRT_MAX);
int8_t geti8(int8_t min = CHAR_MIN, int8_t max = CHAR_MAX);
uint64_t getui64(uint64_t min = 0, uint64_t max = ULLONG_MAX);
uint32_t getui32(uint32_t min = 0, uint32_t max = UINT_MAX);
uint16_t getui16(uint16_t min = 0, uint16_t max = USHRT_MAX);
uint8_t getui8(uint8_t min = 0, uint8_t max = UCHAR_MAX);
bool getb(float true_percentage = 0.5f);
Vec2 getVec2(float min = 0.0f, float max = 1.0f, bool match_xy = false);
Vec2 getVec2(Vec2 minmax_x = { 0.0f, 1.0f }, Vec2 minmax_y = { 0.0f, 1.0f });
float getOpenSimplex2D(float x, float y);
inline FastNoiseLite& getNoiseGenerator(void) { return m_noiseGen; }
template <typename T>
inline T& getFromStdVec(std::vector<T>& list)
{
uint64_t index = static_cast<uint64_t>(geti64(0, list.size()));
return list[index];
}
private:
int64_t m_seed { 0 };
std::mt19937_64 m_engine;
FastNoiseLite m_noiseGen;
};
class Random
{
public:
inline static void seed(int64_t _seed) { Random::s_gen.seed(_seed); }
inline static void autoSeed(void) { Random::s_gen.autoSeed(); }
inline static int64_t getSeed(void) { return Random::s_gen.getSeed(); }
inline static float getf32(float min = 0.0f, float max = 1.0f) { return Random::s_gen.getf32(min, max); }
inline static double getf64(double min = 0.0f, double max = 1.0f) { return Random::s_gen.getf64(min, max); }
inline static int64_t geti64(int64_t min = LLONG_MIN, int64_t max = LLONG_MAX) { return Random::s_gen.geti64(min, max); }
inline static int32_t geti32(int32_t min = INT_MIN, int32_t max = INT_MAX) { return Random::s_gen.geti32(min, max); }
inline static int16_t geti16(int16_t min = SHRT_MIN, int16_t max = SHRT_MAX) { return Random::s_gen.geti16(min, max); }
inline static int8_t geti8(int8_t min = CHAR_MIN, int8_t max = CHAR_MAX) { return Random::s_gen.geti8(min, max); }
inline static uint64_t getui64(uint64_t min = 0, uint64_t max = ULLONG_MAX) { return Random::s_gen.getui64(min, max); }
inline static uint32_t getui32(uint32_t min = 0, uint32_t max = UINT_MAX) { return Random::s_gen.getui32(min, max); }
inline static uint16_t getui16(uint16_t min = 0, uint16_t max = USHRT_MAX) { return Random::s_gen.getui16(min, max); }
inline static uint8_t getui8(uint8_t min = 0, uint8_t max = UCHAR_MAX) { return Random::s_gen.getui8(min, max); }
inline static bool getb(float true_percentage = 0.5f) { return Random::s_gen.getb(true_percentage); }
inline static Vec2 getVec2(float min = 0.0f, float max = 1.0f, bool match_xy = false) { return Random::s_gen.getVec2(min, max, match_xy); }
inline static Vec2 getVec2(Vec2 minmax_x = { 0.0f, 1.0f }, Vec2 minmax_y = { 0.0f, 1.0f }) { return Random::s_gen.getVec2(minmax_x, minmax_y); }
inline static float getOpenSimplex2D(float x, float y) { return Random::s_gen.getOpenSimplex2D(x, y); }
template <typename T>
inline static T& getFromStdVec(std::vector<T>& list) { return Random::s_gen.getFromStdVec<T>(list); }
private:
inline static RandomGenerator s_gen;
};
}
#endif