2014-02-02 3 views
2

Я пытаюсь написать программу, которая использует функцию для генерации 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; 
} 
+1

Вы должны вернуться и прочитать о вызовах определения переменных и функций. Кроме того, не перегружайте каждый раз (особенно не с 'time (0)' в узком цикле). – jerry

+0

Можете ли вы быть более конкретным? У меня есть книга прямо передо мной, и она не очень подробно описывает, где и как вы можете их назвать. – Bobby

+0

Попробуйте выполнить код с помощью отладчика, и если у вас нет одного отпечатка, введите код, чтобы показать, что происходит. –

ответ

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

кажется, что вы вывод функции, а не результат возврата.

+0

Спасибо за ответ, я должен пойти с методом rand, потому что он для задания. Я продолжаю получать ошибку синтаксического анализа в первой строке тела for-loop. «Ошибка анализа до», « – Bobby

+0

@Bobby OK. Сосредоточьтесь на первой части моего ответа. Я удалил ненужную часть. – rhughes

+0

Получил это! Благодаря :) – Bobby

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 перегружает и преобразует указатель на true. Эти вызовы должны быть такими:

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

Хотя это не будет полностью устранить ваши проблемы, вы также должны двигаться:

srand(time(0)); 

за пределами функции желательно в начале вашей программы. Поскольку вы вызываете rand_int десять раз очень быстро, результат time(0), вероятно, будет таким же и, следовательно, вы вернете те же номера 10.

Эта линия:

int rand_int(int min, int max); 

в цикл просто переопределение функции и не требуется.

Хотя, если C++ 11 вариант с использованием random header делает намного больше смысла и гораздо проще:

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

Если C++ 11 не вариант, то ваш должен в мере проверить запись FAQ How can I get random integers in a certain range? C, который дает следующую формулу для генерации чисел в диапазоне [M, N]:

М + RAND()/(RAND_MAX/(N - М + 1) + 1),

и, конечно, всегда есть повышение:

#include <iostream> 
#include <boost/random/mersenne_twister.hpp> 
#include <boost/random/uniform_int_distribution.hpp> 

int main() 
{ 
    boost::random::mt19937 gen; 
    boost::random::uniform_int_distribution<> dist(1, 10); 

    for (int n = 0; n < 10; ++n) { 
    std::cout << dist(gen) << ", "; 
    } 
    std::cout << std::endl ; 
} 
Смежные вопросы