我正在製作一個模板函數對象,它將生成一個範圍隨機數。我知道如何爲整數或浮點數做到這一點。但我的問題是,我希望它能夠生成類型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
使用''庫。 –