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

c++ : Generic Function for random Number generation

本文关键字:函数 用于 随机数 c++      更新时间:2023-10-16

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

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

此函数适用于整数,但对于双精度,它始终产生 0.00

引用:C++随机浮点数生成

编辑:在生成随机数()中添加了返回语句

真的应该使用-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));
}

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

仅供参考,我得到编译错误(包括)。

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