我正在制作一个模板函数对象,它将生成一个范围随机数。我知道如何为整数或浮点数做到这一点。但我的问题是,我希望它能够生成类型T的范围随机数。Float或Int范围内的随机数
所以,因为我希望它能够返回浮点数和整数我不能使用%运算符。这似乎适用于浮点值。但是如果T是INT,它会混淆范围。
return (_minValue + (T)rand()/((T)RAND_MAX/(_maxValue - _minValue)));
该算法中肯定有一些错误,我在这个小时似乎无法找到。
我正在制作一个模板函数对象,它将生成一个范围随机数。我知道如何为整数或浮点数做到这一点。但我的问题是,我希望它能够生成类型T的范围随机数。Float或Int范围内的随机数
所以,因为我希望它能够返回浮点数和整数我不能使用%运算符。这似乎适用于浮点值。但是如果T是INT,它会混淆范围。
return (_minValue + (T)rand()/((T)RAND_MAX/(_maxValue - _minValue)));
该算法中肯定有一些错误,我在这个小时似乎无法找到。
如果类型T
是整数类型,(T)rand()/(T)RAND_MAX
将明显是零除了极少数情况下rand()
返回RAND_MAX
(和T
恰好是至少为int
),在该情况下,将一个。请注意,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(); }
谢谢。学到了很多答案。我忘记了rand()产生了一个介于0和1之间的数字。所以我最终做的是让它成为一个浮点数,然后我就像这样抛出它:return(T)(_ minValue +(float)rand( )/((float)RAND_MAX /(_maxValue - _minValue))); 这并不漂亮,但它的工作原理。 – Christoffer
使用''库。 –