我正在制作一个模板函数对象,它将生成一个范围随机数。我知道如何为整数或浮点数做到这一点。但我的问题是我希望它能够生成 T 类型的范围随机数。
所以,因为我希望它能够返回浮点数和整数,所以我不能使用 % 运算符。这似乎适用于浮点值。但是如果 T 是 INT ,它会弄乱范围。
return (_minValue + (T)rand() / ((T)RAND_MAX / (_maxValue - _minValue)));
这个算法一定有一些错误,我现在似乎找不到。
如果类型T
是整数类型,(T)rand() / (T)RAND_MAX
则显然为零,除了在rand()
返回时RAND_MAX
(并且T
恰好至少为 as int
)的罕见情况,在这种情况下它将为 1。请注意,这rand()
通常不是一个非常好的随机数生成器,尽管不同实现之间的质量差异很大。你可能最好只使用<random>
库中的一些东西(对于我的正常工作,我很少需要随机数,即,我不知道如何立即使用这个库中的组件)。
如果你坚持使用rand()
你最好的选择可能是确定整数和浮点数不同的随机值,例如:
template <typename T, bool = std::is_floating_point<T>::value>
struct random;
template <typename T>
struct random<T, true> {
static T generate() { return /* floating point formula goes here */; }
};
template <typename T>
struct random<T, false> {
static T generate() { return /* integer formula goes here */; }
};
template <typename T>
T random_range() { return random<T>::generate(); }