如何从字符串中获取0到1700之间的随机数?

时间:2014-02-12 20:58:51

标签: c++

目前我正在使用

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);

但是01700给我的是-99999(我认为)。我有一种感觉,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

2 个答案:

答案 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);
}

此处的额外增益(除了使用强大而正确的经过验证的代码片段)是

  1. std :: uniform_real_distribution产生随机浮点值i,均匀分布在区间[fMin,fMax]上,因此您不会在随机性中引入任何偏差。

  2. 您正在生成直接随机浮点值,而不是整数,然后将其转换为double。