2026-02-11 19:40:26 +08:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <random>
|
2026-02-27 20:46:16 +08:00
|
|
|
#include <types/base/types.h>
|
|
|
|
|
|
2026-02-11 19:40:26 +08:00
|
|
|
|
|
|
|
|
namespace extra2d {
|
|
|
|
|
|
|
|
|
|
// ============================================================================
|
|
|
|
|
// Random 类 - 随机数生成器
|
|
|
|
|
// ============================================================================
|
|
|
|
|
class Random {
|
|
|
|
|
public:
|
|
|
|
|
/// 获取单例实例
|
|
|
|
|
static Random &getInstance();
|
|
|
|
|
|
|
|
|
|
/// 设置随机种子
|
|
|
|
|
void setSeed(uint32 seed);
|
|
|
|
|
|
|
|
|
|
/// 使用当前时间作为种子
|
|
|
|
|
void randomize();
|
|
|
|
|
|
|
|
|
|
/// 获取 [0, 1) 范围内的随机浮点数
|
|
|
|
|
float getFloat();
|
|
|
|
|
|
|
|
|
|
/// 获取 [min, max] 范围内的随机浮点数
|
|
|
|
|
float getFloat(float min, float max);
|
|
|
|
|
|
|
|
|
|
/// 获取 [0, max] 范围内的随机整数
|
|
|
|
|
int getInt(int max);
|
|
|
|
|
|
|
|
|
|
/// 获取 [min, max] 范围内的随机整数
|
|
|
|
|
int getInt(int min, int max);
|
|
|
|
|
|
|
|
|
|
/// 获取随机布尔值
|
|
|
|
|
bool getBool();
|
|
|
|
|
|
|
|
|
|
/// 获取随机布尔值(带概率)
|
|
|
|
|
bool getBool(float probability);
|
|
|
|
|
|
|
|
|
|
/// 获取指定范围内的随机角度(弧度)
|
|
|
|
|
float getAngle();
|
|
|
|
|
|
|
|
|
|
/// 获取 [-1, 1] 范围内的随机数(用于方向)
|
|
|
|
|
float getSigned();
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
Random();
|
|
|
|
|
~Random() = default;
|
|
|
|
|
|
|
|
|
|
Random(const Random &) = delete;
|
|
|
|
|
Random &operator=(const Random &) = delete;
|
|
|
|
|
|
|
|
|
|
std::mt19937 generator_;
|
|
|
|
|
std::uniform_real_distribution<float> floatDist_;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// ============================================================================
|
|
|
|
|
// 便捷函数
|
|
|
|
|
// ============================================================================
|
|
|
|
|
|
|
|
|
|
/// 获取 [0, 1) 范围内的随机浮点数
|
|
|
|
|
inline float randomFloat() { return Random::getInstance().getFloat(); }
|
|
|
|
|
|
|
|
|
|
/// 获取 [min, max] 范围内的随机浮点数
|
|
|
|
|
inline float randomFloat(float min, float max) {
|
|
|
|
|
return Random::getInstance().getFloat(min, max);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// 获取 [0, max] 范围内的随机整数
|
|
|
|
|
inline int randomInt(int max) { return Random::getInstance().getInt(max); }
|
|
|
|
|
|
|
|
|
|
/// 获取 [min, max] 范围内的随机整数
|
|
|
|
|
inline int randomInt(int min, int max) {
|
|
|
|
|
return Random::getInstance().getInt(min, max);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// 获取随机布尔值
|
|
|
|
|
inline bool randomBool() { return Random::getInstance().getBool(); }
|
|
|
|
|
|
|
|
|
|
/// 获取随机布尔值(带概率)
|
|
|
|
|
inline bool randomBool(float probability) {
|
|
|
|
|
return Random::getInstance().getBool(probability);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace extra2d
|