c ++:随机数生成的通用函数

时间:2013-10-31 05:55:06

标签: c++ stl

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

#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;
}

此功能适用于整数,但对于 double ,它始终生成 0.00

参考文献: C++ random float number generation

编辑:在generateRandomNumber()

中添加了return语句

3 个答案:

答案 0 :(得分: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));
}

答案 1 :(得分:2)

观看Stephan T. Lavavej撰写的来自Going Native 2013的rand() considered harmful演示文稿,了解如何以及为何使用C ++ 11随机数生成工具并避免使用rand()。

答案 2 :(得分:1)

仅供参考,我收到编译错误(包括&lt; cstdlib&gt;)。

但真正的问题是你没有从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;
}