@HoShik

Почему ГПСЧ нужно инициализировать в main()?

Имеется такой код:
#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#include <locale.h>
int fill_array(int array[], int l_gen, int u_gen, int size) 
{
    int sum=0;
    for(int i=0; i<size; i++) 
    {
        array[i]=l_gen+rand()%(u_gen-l_gen+1);
        sum+=array[i];
    }
    return sum;
}
void print_array(int array[], int size) 
{
    for(int i=0; i<size; i++) 
    {
        printf("%d ", array[i]);
    }
}
int main(void)
{   
    setlocale(LC_ALL, "Russian");
    srand(time(NULL));
    printf("Введите через пробел нижнюю границу генерации, верхнюю и размер массивов: ");
    int l_gen, u_gen, size, sum_max=INT_MIN+1, position;
    scanf("%d %d %d", &l_gen, &u_gen, &size);
    int array[size], big_array[size];
    for(int i=0, current_sum; i<10; i++) 
    {
        current_sum=fill_array(array,l_gen,u_gen,size);
        printf("Сумма массива под номером %d равна %d\n", i+1,current_sum);
        if(current_sum>sum_max) 
        {
            sum_max=current_sum;
            for(int j=0; j<size; j++) 
            {
                big_array[j]=array[j];
            }
            position=i+1;
        } 
    }
    printf("Массив под номером %d имеет самую наибольшую сумму (%d) из всех созданных\n", position, sum_max);
    print_array(big_array, size);
}

Инициализация ГПСЧ через srand в функции main приводит к правильной работе программы. Если инициализировать ГПСЧ в fill_array, происходит ошибка. Кто сможет разъяснить, с чем это связано? Пример неправильного вывода:
Сумма массива под номером 2 равна 73
Сумма массива под номером 3 равна 73
Сумма массива под номером 4 равна 73
Сумма массива под номером 5 равна 73
Сумма массива под номером 6 равна 73
Сумма массива под номером 7 равна 73
Сумма массива под номером 8 равна 73
Сумма массива под номером 9 равна 73
Сумма массива под номером 10 равна 76
  • Вопрос задан
  • 95 просмотров
Решения вопроса 1
GavriKos
@GavriKos
Не должно быть ошибки. Если вы только не в цикле его инициализируете. Приведите код который приводит к ошибке.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@romancelover
программист C++ под Linux
Потому что в srand() будет передаваться одинаковое число. Функция time возвращает число секунд от начала 1970 года, её значение меняется раз в секунду, а цикл программы выполняется намного быстрее.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Cedro Москва
от 70 000 до 100 000 ₽
Efix Group Москва
от 300 000 до 400 000 ₽
от 3 500 до 4 000 $
07 мар. 2021, в 23:34
5000 руб./за проект
07 мар. 2021, в 23:14
10000 руб./за проект