0

以下代码生成一个随机数。使用模板,我已经修改它以根据参数类型生成输入范围之间的随机数:

#include <iostream>
#include <ctime>
#include <iomanip>
#include <limits>

using namespace std;

template <class T>
T generateRandomNumber(T startRange, T endRange)
{
    T randNum = startRange + (T)rand()/((T)RAND_MAX/(T)(endRange-startRange));
    return(randNum);  // It was the ERROR
}
int main()
{
    srand((unsigned)time(0));

    cout << generateRandomNumber(0,100);

    std::cout << std::fixed;
    std::cout << std::setprecision(2);
    cout << generateRandomNumber(0.0,99.99);
    return 0;
}

此函数对integer工作正常,但对于double,它总是产生0.00

参考: C++ 随机浮点数生成

编辑:在 generateRandomNumber() 中添加了 return 语句

4

3 回答 3

3

真的应该使用-Wall. 如果你有,你的编译器可能会告诉你类似的东西:

badrand.cc:11:7: warning: unused variable ‘randNum’ [-Wunused-variable]
badrand.cc:12:1: warning: no return statement in function returning non-void [-Wreturn-type

换句话说,你generateRandomNumber永远不会返回一个值。相反,它分配给randNum立即超出范围的局部变量。

尝试:

template <class T>
T generateRandomNumber(T startRange, T endRange)
{
    return startRange + (T)rand()/((T)RAND_MAX/(T)(endRange-startRange));
}

或者,可能更具可读性:

template <class T>
T generateRandomNumber(T startRange, T endRange)
{
    return startRange + T(rand()) / T(RAND_MAX) * (endRange - startRange));
}
于 2013-10-31T06:08:58.733 回答
2

观看 Stephan T. Lavavej 的rand() 考虑了 Going Native 2013 中的有害演示,了解如何以及为什么应该使用 C++11 随机数生成工具并避免使用 rand()。

于 2013-10-31T06:01:44.103 回答
1

仅供参考,我收到编译错误(包括 <cstdlib>)。

但真正的问题是你没有从generateRandomNumber.

我建议打印一个换行符进行分隔。

#include <cstdlib>
#include <iostream>
#include <ctime>
#include <iomanip>
#include <limits>

using namespace std;

template <class T>
T generateRandomNumber(T startRange, T endRange)
{
    return startRange + (T)rand()/((T)RAND_MAX/(T)(endRange-startRange));
}
int main()
{
    srand((unsigned)time(0));

    cout << generateRandomNumber(0,100) << "\n";

    std::cout << std::fixed;
    std::cout << std::setprecision(2);
    cout << generateRandomNumber(0.0,99.99) << "\n";
    return 0;
}
于 2013-10-31T06:06:59.777 回答