gpt4 book ai didi

c++ - float/double 的小范围随机数,适用于整数类型(C++、VS2010)

转载 作者:太空宇宙 更新时间:2023-11-04 12:01:02 24 4
gpt4 key购买 nike

我正在尝试使用 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 的对象返回覆盖整个范围的数字,但对于花车和 double ,他们没有。 float 都在 1e+379e+38 之间, double 在 1e+3072e+308 之间(或者至少所有人都在那个街区)。在 VS 调试器中检查 dist 对象显示限制是正确的,但 Values vector 填充的数字范围要小得多。

有人知道为什么限制不能正常工作吗?

最佳答案

您正在生成 numeric_limits<T>::min() 之间的值和 numeric_limits<T>::max() .但是numeric_limits<T>::min()可能不是您期望的那样:对于浮点类型,它是最小的 归一化值,非常接近于零。所以你的代码只能得到正 float 。对于 float ,这将是最大约 3.4e38 的数字。这些数字中的绝大多数都超过 1e37,因此这些是您获得的大部分结果是有道理的。

要获得可能的有限值,您需要使用 numeric_limits<T>::lowest() 的范围至 numeric_limits<T>::max() .但这会导致未定义的行为,因为传递给 uniform_real_distribution 的范围大小必须达到 numeric_limits<RealType>::max() .

因此您需要以不同的方式生成数字。例如,您可以生成一个介于 0 和 numeric_limits<T>::max() 之间的非负数。 , 并分别生成其符号。

关于c++ - float/double 的小范围随机数,适用于整数类型(C++、VS2010),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14110546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com