我想要一个模板化的类,在下限和上限之间生成随机数(两个限制都可以是负数)。这就是我到目前为止所做的:
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.
这正确地生成了双精度值,但整数是关闭的。有谁知道如何编写通用和双打的通用解决方案?对于整数和双打,我不需要不同的函数。
答案 0 :(得分:1)
当您在1和10之间生成一个数字时,实际上会生成一个从1.0到10.0的随机双精度。
然后,当将其转换回整数时,该数字将被截断。因此1.X变为1,2.X变为2,等等10. 10.X将变为10,但在该范围内产生的唯一值恰好是10.0 - 这将是罕见的,因为它只发生在基础随机的极限功能
因此对于整数,您的范围计算是不合适的。
我真的建议你只对整数模板进行专门化。
请注意,这实际上不是舍入问题 - 如果舍入到最接近的值,则顶部和底部值的可能性将是其他值的一半。
另外,如果您的随机生成是正确的,请不要简单地计算平均值 - 这将隐藏分布中的许多错误。例如,如果上限和下限都错误相同,则平均值仍然可能是正确的(例如,调整舍入可能看起来不正确)。或者你的数字可以是钟形曲线或其他东西,而不是平坦的。计算直方图。