2013-10-08 85 views
0

我正在制作一个模板函数对象,它将生成一个范围随机数。我知道如何为整数或浮点数做到这一点。但我的问题是,我希望它能够生成类型T的范围随机数。Float或Int范围内的随机数

所以,因为我希望它能够返回浮点数和整数我不能使用%运算符。这似乎适用于浮点值。但是如果T是INT,它会混淆范围。

return (_minValue + (T)rand()/((T)RAND_MAX/(_maxValue - _minValue))); 

该算法中肯定有一些错误,我在这个小时似乎无法找到。

+1

使用''库。 –

回答

1

如果类型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(); } 
+0

谢谢。学到了很多答案。我忘记了rand()产生了一个介于0和1之间的数字。所以我最终做的是让它成为一个浮点数,然后我就像这样抛出它:return(T)(_ minValue +(float)rand( )/((float)RAND_MAX /(_maxValue - _minValue))); 这并不漂亮,但它的工作原理。 – Christoffer