【问题标题】:C++ template class generating random int and doubles生成随机 int 和 double 的 C++ 模板类
【发布时间】:2013-03-16 11:23:29
【问题描述】:

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

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.

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

【问题讨论】:

  • C++2011 为您提供std::random 模板。您需要 GCC 4.7 或 4.8
  • 值如何关闭?它们是否被截断为零?
  • 我不想使用新的 C++ 标准。
  • 运行 RandomGenerator::generate(1, 3) 时,100000 次迭代的平均值是 1.5(实际上应该是 2)。 RandomGenerator::generate(-4, 0) 结果平均为-1.5(实际上应该是-2)
  • 你只需要正确舍入而不是截断。

标签: c++ templates random range limit


【解决方案1】:

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

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

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

我真的建议您专门为整数模板。

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

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

【讨论】:

    猜你喜欢
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 2012-03-10
    • 2022-01-06
    • 2021-11-08
    • 2022-10-17
    • 1970-01-01
    相关资源
    最近更新 更多