C ++模板类生成随机int和double

时间:2013-03-16 11:23:29

标签: c++ templates random range limit

我想要一个模板化的类,在下限和上限之间生成随机数(两个限制都可以是负数)。这就是我到目前为止所做的:

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.

这正确地生成了双精度值,但整数是关闭的。有谁知道如何编写通用和双打的通用解决方案?对于整数和双打,我不需要不同的函数。

1 个答案:

答案 0 :(得分:1)

当您在1和10之间生成一个数字时,实际上会生成一个从1.0到10.0的随机双精度。

然后,当将其转换回整数时,该数字将被截断。因此1.X变为1,2.X变为2,等等10. 10.X将变为10,但在该范围内产生的唯一值恰好是10.0 - 这将是罕见的,因为它只发生在基础随机的极限功能

因此对于整数,您的范围计算是不合适的。

我真的建议你只对整数模板进行专门化。

请注意,这实际上不是舍入问题 - 如果舍入到最接近的值,则顶部和底部值的可能性将是其他值的一半。

另外,如果您的随机生成是正确的,请不要简单地计算平均值 - 这将隐藏分布中的许多错误。例如,如果上限和下限都错误相同,则平均值仍然可能是正确的(例如,调整舍入可能看起来不正确)。或者你的数字可以是钟形曲线或其他东西,而不是平坦的。计算直方图。