Результат функции должен быть двойным, но он дает мне целое число

Я сделал программу, которая на самом деле хороша и работает, и в ней есть определяемая пользователем функция, но есть только одна проблема, как показано в заголовке, я получил целочисленный вывод вместо двойного, я не знаю почему, и я все перепробовал Я знаю, но в итоге потерпел неудачу.

Почему результатом функции является целое число, а не двойное?

Напишите функцию main(), которая предлагает пользователю ввести три целых числа, нижнее и верхнее, а затем вызывает функцию average(): double average( int howManyNumbers, int lower, int upper), которая генерирует howManyNumbers случайные целые числа в нижнем и верхнем диапазоне включительно. Затем функция находит и возвращает среднее значение случайно сгенерированных целых чисел. Функция должна генерировать разные наборы значений для каждого прогона.

А это код моей программы:

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

int main ()
{
    int number,lower,upper;
    double average (int , int , int);
    cout<<"Enter number, lower, upper: ";
    cin>>number>>lower>>upper;
    cout<<showpoint<<fixed;
    cout<<"The average of the "<<number<<" random integers is"<<average(number,lower,upper );
    return 0;
}

double average (int howManyNumbers, int lower, int upper)
{
    int i;
    double avg,sum=0;
    for (i=0;i<howManyNumbers;i++)
        {
            srand(time(0));
            sum=sum+(lower+rand()%(upper-lower+1));
        }

    avg=(sum/howManyNumbers);
    return avg;
}

person Abdullah    schedule 03.12.2015    source источник
comment
(lower+rand()%(upper-lower+1)) вся эта арифметика включает только целые числа.   -  person user657267    schedule 03.12.2015
comment
Иногда (double)3.0 выводится как 3, но внутренне это все равно double   -  person Basile Starynkevitch    schedule 03.12.2015
comment
Очень сомневаюсь, что для average(100,0,100 ) дает целое число. avg=(sum/howManyNumbers); не является целочисленной арифметикой.   -  person DarkZeros    schedule 03.12.2015
comment
avg=(sum/(double)howManyNumbers); Когда вам нужен результат с плавающей запятой, убедитесь, что все значения, с которыми вы работаете, также являются с плавающей запятой. Арифметические операторы с целыми числами могут привести к усечению всего до целого числа перед неявным преобразованием обратно в число с плавающей запятой.   -  person RyanP    schedule 03.12.2015
comment
@DarkZeros, вы можете увеличить среднее значение в два раза, умножив его на 1.0 следующим образом: avg = 1.0 * (sum / howManyNumbers), так как sum / howManyNumbers дает целое число, умножьте его на 1.0, чтобы получить удвоение. (Как я узнал от своего врача)   -  person Abdullah    schedule 03.12.2015


Ответы (2)


Переместите srand(time(0)); в точку перед петлей.

С srand(time(0)); вы повторно инициализируете генератор случайных чисел в каждом цикле, и это приводит к тому же результату от вызова rand() на каждой итерации цикла for, таким образом добавляя то же число к sum howManyNumbers количеству раз.

Следовательно, при делении на howManyNumbers он возвращает "целое" целое число (или достаточно близко, чтобы ошибка не отображалась с учетом используемой точности).

Просто;

srand(time(0)); // moved to before the loop.
for (i=0;i<howManyNumbers;i++)
{
  // ...
}

Демо

person Niall    schedule 03.12.2015
comment
Он работал отлично, спасибо большое за информацию и спасибо за объяснение ^^ - person Abdullah; 03.12.2015

вам нужно позвонить srand(time(0)); только один раз, и вы получите двойной результат.

 srand(time(0));
 for (i=0;i<howManyNumbers;i++)
 {
     sum=sum+(lower+rand()%(upper-lower+1));
 }
person Mauri    schedule 03.12.2015
comment
Большое спасибо, братан, это действительно сработало, и это дало мне двойную ценность. но можете ли вы сказать мне, что именно произошло, когда я переместил srand (time (0)) за пределы цикла? - person Abdullah; 03.12.2015
comment
Следующая ссылка объясняет, почему вы должны инициализировать srand только один раз за весь сеанс для генерации разных чисел. stackoverflow.com/questions/5620163/use-of-srand-in-c - person Mauri; 03.12.2015