0

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

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.

这会正确生成双精度值,但整数是关闭的。有谁知道如何为整数和双精度编写通用解决方案?我不想要整数和双精度的不同功能。

4

1 回答 1

1

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

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

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

我真的建议只将您的模板专门用于整数。

请注意,这并不是真正的四舍五入问题 - 如果您四舍五入到最接近的值,则顶部和底部值的可能性将是其他值的一半。

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

于 2013-03-16T11:46:05.743 回答