以下代码生成一个随机数。使用模板,我修改了它,根据参数类型生成输入范围之间的随机数:
#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语句答案 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;
}