visual studio 2010 -浮点/双精度随机数的小范围,适用于整型(c++, VS2010)
visual studio 2010 - Small range of random numbers for float/double, good for integral types (C++, VS2010)
我试图在VS2010中使用基于类型的随机数创建模板。我使用下面的代码:
template<class BaseT>
struct distribution
{ // general case, assuming T is of integral type
typedef std::tr1::uniform_int<BaseT> dist_type;
};
template<>
struct distribution<float>
{ // float case
typedef std::tr1::uniform_real<float> dist_type;
};
template<>
struct distribution<double>
{ // double case
typedef std::tr1::uniform_real_distribution<double> dist_type;
};
template<class BaseT>
class BaseTypeRandomizer
{
public:
BaseTypeRandomizer() : mEngine(std::time(0))
{
}
void CreateValues(std::vector<BaseT>& Values, size_t nValues)
{
typedef typename distribution<BaseT>::dist_type distro_type;
std::random_device Engine;
distro_type dist(std::numeric_limits<BaseT>::min(), std::numeric_limits<BaseT>::max());
for (size_t iVal = 0; iVal < nValues; ++iVal)
{
Values[iVal] = dist(Engine);
}
}
};
不幸的是,为char
/int
/long
等(整型)创建BaseTypeRandomizer对象会返回覆盖整个范围的数字,但对于浮点数和双精度数则不会。浮点数都在1e+37
到9e+38
之间,双精度数都在1e+307
到2e+308
之间(或者至少都在附近)。在VS调试器中检查dist
对象显示限制是正确的,但是Values
向量填充的数字范围要小得多。
有没有人知道为什么限制不能正常工作?
生成的值介于numeric_limits<T>::min()
和numeric_limits<T>::max()
之间。但是numeric_limits<T>::min()
可能不是您期望的那样:对于浮点类型,它是最小的正规范化值,非常接近于零。所以你的代码只能得到正的浮点数。对于float
,这将是大约3.4e38的数字。这些数字中的绝大多数都大于1e37,所以这些是您得到的大多数结果是有道理的。
要获得可能的有限值,您需要使用从numeric_limits<T>::lowest()
到numeric_limits<T>::max()
的范围。但是这会导致未定义的行为,因为传递给uniform_real_distribution
的范围的大小必须不超过numeric_limits<RealType>::max()
。
所以你需要用另一种方式生成数字。例如,您可以生成0到numeric_limits<T>::max()
之间的非负数,并单独生成其符号。
相关文章:
- OpenGL - 在 NDC 中计算位置适用于着色器,但不适用于'regular'程序
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 如何修复我的最大公约数代码?它适用于除零和零以外的所有数字
- 选择排序C++(已修改)并非适用于所有情况
- 无法让"std::enable_if"适用于无作用域枚举
- 请找出我的代码中的错误,它在提交得到错误答案的同时仍然适用于我的所有测试用例
- 确定夏令时是否适用于特定日期
- 是否有一种 STL 算法可以最后找到,但它也适用于指针?
- QT 样式表主题,适用于使用属性选择器的整个应用程序
- C++带有适用于左值和右值的引用参数的函数
- 代码适用于调试,但不适用于发布
- C++17 和更新的 std::分配器是否适用于动态数量的自定义堆?
- 适用于大型数组的无复制线程安全环形缓冲区
- C++参数类型以接受适用于基于范围的 for 循环的所有序列
- std::copy_n 是否适用于重叠范围?
- 常数,但仅适用于此范围的剩余部分
- 确定谓词是否适用于一个范围的全部、部分或全部元素
- 延长临时的生命周期,适用于块范围的聚合,但不是通过"新";为什么?
- 为什么范围基本循环不适用于堆中的数组,但适用于堆栈中的数组
- visual studio 2010 -浮点/双精度随机数的小范围,适用于整型(c++, VS2010)