【问题标题】:Random number within range for Float OR IntFloat OR Int 范围内的随机数
【发布时间】:2013-10-08 22:44:12
【问题描述】:

我正在制作一个模板函数对象,它将生成一个范围随机数。我知道如何为整数或浮点数做到这一点。但我的问题是我希望它能够生成 T 类型的范围随机数。

所以,因为我希望它能够返回浮点数和整数,所以我不能使用 % 运算符。这似乎适用于浮点值。但是如果 T 是 INT ,它会弄乱范围。

return (_minValue + (T)rand() / ((T)RAND_MAX / (_maxValue - _minValue)));

该算法中一定有一些错误,我现在似乎找不到。

【问题讨论】:

  • 使用<random> 库。

标签: c++ algorithm gcc stl std


【解决方案1】:

如果类型T 是整数类型,则(T)rand() / (T)RAND_MAX 显然为零,​​除非rand() 返回RAND_MAX(并且T 恰好至少为int)在哪种情况下它将是一个。请注意,rand() 通常不是一个非常好的随机数生成器,尽管不同实现之间的质量差异很大。你可能最好只使用<random> 库中的一些东西(对于我的正常工作,我很少需要随机数,即我不知道如何立即使用这个库中的组件)。

如果你坚持使用rand(),你最好的选择可能是为整数和浮点确定不同的随机值,例如:

template <typename T, bool = std::is_floating_point<T>::value>
struct random;
template <typename T>
struct random<T, true> {
    static T generate() { return /* floating point formula goes here */; }
};
template <typename T>
struct random<T, false> {
    static T generate() { return /* integer formula goes here */; }
};

template <typename T>
T random_range() { return random<T>::generate(); }

【讨论】:

  • 谢谢。从这个答案中学到了很多东西。我忘记了 rand() 生成一个介于 0 和 1 之间的数字。所以我最终做的就是让它一直是一个浮点数,然后我只是将它投射,如下所示:return (T)(_minValue + (float)rand( ) / ((float)RAND_MAX / (_maxValue - _minValue)));它不漂亮,但它有效。
猜你喜欢
  • 2011-12-16
  • 1970-01-01
  • 2010-12-24
  • 2018-03-14
  • 1970-01-01
  • 2021-02-10
  • 2019-08-31
  • 2014-05-08
相关资源
最近更新 更多