生成随机整型和双精度的c++模板类

C++ template class generating random int and doubles

本文关键字:c++ 双精度 随机 整型      更新时间:2023-10-16

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

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.

正确地生成双精度值,但是整型是关闭的。有人知道如何为int型和double型编写通用的解决方案吗?我不希望为int型和double型提供不同的函数

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

当将其转换回整数时,该数字将被截断。所以1。X变成了。X变成2,以此类推,10。X将变成10,但在该范围内生成的唯一值恰好是10.0——这将是罕见的,因为它只发生在底层随机函数的极限。

所以对于整数,你的范围计算是不合适的

我真的建议你把你的模板专门用于整数。

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

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