目前我正在使用
double fRand(double fMin, double fMax)
{
double f = (double)rand() / RAND_MAX;
return fMin + f * (fMax - fMin);
}
double RangeFinder::getRange(void) {
return fRand(0, 1700);
};
char range[12];
double r = rangeFinder.getRange();
snprintf(range, 11, "range: %d", r);
但是0
,1700
给我的是-99
,999
(我认为)。我有一种感觉,msb正在将数千个地方解释为负面。
有什么问题?
double fRand(double fMin, double fMax)
{
double f = (double)rand() / RAND_MAX;
return fMin + f * (fMax - fMin);
}
double RangeFinder::getRange(void) {
return fRand(0, 1700);
};
char range[22];
int r = rangeFinder.getRange();
snprintf(range, 22, "range: %i ", r);
LCDString(range);
第二个arg到snprintf
是11 ..太短了。数字后面没有白色字符可以清除以前的值,double r
需要投放int r
。
答案 0 :(得分:5)
可能的问题是"%d"
用于整数。为了打印浮动/双打,您应该使用"%f"
(浮点数)或"%lf"
(双打或长浮点数)。
答案 1 :(得分:3)
提醒一句:Stephan T. Lavavej在他的演讲rand() Considered Harmful中强调了为什么不在C ++中使用rand()
并展示c ++ 11替代品。
你的fRand可以写成
#include <random>
double fRand(double fMin, double fMax)
{
std::random_device rd;
std::mt19937 e2(rd());
std::uniform_real_distribution<> dist(fMin, fMax);
return dist(e2);
}
此处的额外增益(除了使用强大而正确的经过验证的代码片段)是
std :: uniform_real_distribution产生随机浮点值i,均匀分布在区间[fMin,fMax]上,因此您不会在随机性中引入任何偏差。
您正在生成直接随机浮点值,而不是整数,然后将其转换为double。