2013-03-16 51 views
0

我想要一個生成隨機數在下限和上限之間的模板化類(兩個限制都可以是負數)。這是我到目前爲止:C++模板類生成隨機int和雙打

template <typename T> 
T RandomGenerator<T>::generate(T lowerLimit, T upperLimit) 
{ 
    static bool initialized = initialize(); 
    return double(rand()) * (upperLimit - lowerLimit)/RAND_MAX + lowerLimit; 
} 

template <typename T> 
bool RandomGenerator<T>::initialize() 
{ 
    srand(time(NULL)); 
} 

int iVal = RandomGenerator<int>::generate(1, 10); //Generate integers between (and including) 1 and 10. 
double dVal = RandomGenerator<double>::generate(-1, 1); //Generate doubles between (and including) -1 and 1. 

這正確地生成double值,但整數關閉。有誰知道如何編寫一個通用的解決方案,用於整數和雙精度?我不希望有一個不同的函數用於整數和雙精度。

+5

C++ 2011爲您提供了'std :: random'模板。您需要GCC 4.7或4.8 – 2013-03-16 11:25:36

+0

這些值如何關閉?它們是否被截斷爲零? – JSQuareD 2013-03-16 11:26:17

+0

我不想使用新的C++標準。 – goocreations 2013-03-16 11:30:53

回答

1

當您生成1到10之間的數字時,實際上會生成一個從1.0到10.0的隨機雙精度值。

然後,當將其轉換回整數時,數字將被截斷。因此1.X變成1,2.X變成2等等。10.X將變成10,但是在該範圍中產生的唯一值恰好爲10.0--這將是罕見的,因爲它僅發生在底層隨機的極限處功能。

因此對於整數,你的範圍計算是不合適的。

我真的建議只是專門爲整數模板。

請注意,這不是一個真正的四捨五入問題 - 如果您四捨五入到最近值,頂部和底部值將是其他值的一半。

另外,如果你的隨機生成是正確的,請不要簡單地計算出平均值 - 這會隱藏分佈中的許多錯誤。例如,如果上限和下限都是相同數量的錯誤,則平均數仍然可能是正確的(例如,調整四捨五入可能看起來不正確)。或者你的數字可能是鐘形曲線或某種東西,而不是平坦的。計算直方圖。