2013-10-08 135 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