给定范围内的随机数发生器

时间:2014-02-02 03:05:50

标签: c++ function random

我正在尝试编写一个程序,该程序使用一个函数在用户提供的范围内生成10个随机数。它似乎工作正常,除了返回的数字都是1的事实:

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int rand_int(int min, int max);

int main()
{
    int min, max;

    cout << "Hello user.\n\n"
         << "This program will generate a list of 10 random numbers within a 
         given range.\n"
         << "Please enter a number for the low end of the range: ";
    cin  >> min;
    cout << "You entered " << min << ". \n"
         << "Now please enter a number for the high end of the range: ";
    cin  >> max;

    while(min > max){
        cout << "Error: Your low number is higher than your high number.\n"
             << "Please reenter your high number, or press ctrl + c 
                 to end program.\n";
        cin  >> max;
        cout << endl;
    }

    for(int i = 0; i < 10; i++){
        int rand_int(int min, int max);
        cout << rand_int << endl;
    }

    return 0;
}


int rand_int(int min, int max)
{
    srand(time(0)); // Ensures rand will generate different numbers at different times

    int range = max - min;

    int num = rand() % (range + min);

    return num;
}

3 个答案:

答案 0 :(得分:4)

启用警告可能对此有所帮助,-Wall标志gcc告诉我们:

warning: the address of 'int rand_int(int, int)' will always evaluate as 'true' [-Waddress]
     cout << rand_int << endl;
             ^

虽然clang发出警告而无需添加标记。你在这里使用了一个函数指针,因为std::cout没有函数指针的overload,所以选择 bool 重载并将函数指针转换为{{1} }。电话应该是这样的:

true

虽然这不能完全解决您的问题,但您还需要移动:

std::cout << rand_int(min, max)  <<std::endl;

在您的功能之外,最好在您的计划开始时。由于您非常快速地拨打srand(time(0)); 十次,rand_int的结果可能会相同,因此您将返回相同的time(0)个数字。

这一行:

10
for循环中的

只是函数的重新声明,不需要。

虽然,如果 C ++ 11 是使用random header的选项,那会更有意义,也更简单:

int rand_int(int min, int max);

如果 C ++ 11 不是一个选项,那么您至少应该查看How can I get random integers in a certain range? C FAQ条目,该条目提供以下公式,用于生成{{1}范围内的数字}:

  

M + rand()/(RAND_MAX /(N - M + 1)+ 1)

当然总有提升:

#include <iostream>
#include <random>

int main()
{
    std::random_device rd;

    std::mt19937 e2(rd());

    std::uniform_int_distribution<int> dist(1,10);

    for (int n = 0; n < 10; ++n) {
            std::cout << dist(e2) << ", " ;
    }
    std::cout << std::endl ;
}

答案 1 :(得分:0)

尝试更改此内容:

for(int i = 0; i < 10; i++){
    int rand_int(int min, int max);
    cout << rand_int << endl;
}

为:

for(int i = 0; i < 10; i++){
    int myRandomNumber = rand_int(int min, int max);
    cout << myRandomNumber << endl;
}

您似乎在输出函数而不是它的返回结果。

答案 2 :(得分:0)

最快和最简单的方法来获取某个范围内的随机数是-

int lower=1,upper=10;//for example
srand(time(0));
int y = (rand() % (upper-lower + 1)) + lower;

它将为您提供-[1,10](包括两者)范围内的输出。

就是这样。干杯!