Вопрос

for(i = 0; i < n; i++){
        srand(time(NULL));
        printf("%d ", time(NULL));
        for(j = 0; j < (n-1); j++){
            a[i][j] = rand();
        }
    }

Я пытаюсь генерировать случайные числа, но они одни и те же...Я стараюсь srand(i * time(NULL)).Неважно..Что мне следует делать?

Объявление массива:

int** a;
int i;
printf("Enter array size: ");
scanf("%d", &n);

a = (int**)calloc(n, sizeof(int));
for(i = 0; i < n; i++)
    a[i] = (int*)calloc(n-1, sizeof(int));
Это было полезно?

Решение

Позвонить srand() вне цикла.Вы пересеваете его на каждой итерации.

srand() запускает генератор случайных чисел, так что вы получаете различную последовательность случайных чисел в зависимости от входных данных.Ваш цикл выполняется очень быстро, поэтому вызов time(NULL) всегда возвращает одно и то же значение.Вы возвращаетесь к одной и той же случайной последовательности с каждой итерацией.Как правило, вызывайте только srand() один раз в вашей программе.

Другие советы

Не звони srand() каждый раз через цикл - просто делайте это один раз заранее.

Вопросы и ответы 13.15 Для 13.20 будет представлять интерес.И у меня возникает соблазн создать новый тег для таких вопросов.

srand это функция, которая "запускает" генератор случайных чисел.На случай, если вы не знаете, случайные числа в компьютерах на самом деле не случайны.По сути, у компьютера просто есть список чисел, которые кажутся в нем случайными, и вы используете srand чтобы указать ему, с чего начать в этом списке, при каждом вызове rand() возвращает следующий элемент в списке.

Причина, по которой вы пишете srand(time(NULL)) заключается в том, чтобы заставить случайные числа начинаться в какой-то момент, который не будет одинаковым каждый раз, когда вы запускаете программу (если только программы не запускаются в одно и то же время).

Итак, что вы здесь делаете, это многократно указываете программе перезапустить список случайных чисел в один и тот же момент (потому что время одно и то же каждый раз, когда вы проходите цикл).Переместите вызов в srand выйдите за пределы цикла, и вы получите правильные результаты.

alt text

srand(time(NULL)); 

for(i = 0; i < n; i++){         
        printf("%d ", time(NULL)); 
        for(j = 0; j < (n-1); j++){ 
            a[i,j] = rand(); 
        } 
    } 

Вызовите srand один раз вне цикла.

Тебе нужно позвонить srand() перед входом в цикл. srand() инициализирует генератор чисел radnom с заданным начальным значением и генерирует уникальную последовательность случайных чисел для этого начального значения.

Ваш цикл выполняется очень быстро, поэтому каждый вызов time(NULL) дает одинаковое время (измеряемое в секундах) - следовательно, вы инициализируете генератор случайных чисел с одним и тем же начальным значением на каждой итерации цикла.

srand(time(NULL));
for(i = 0; i < n; i++){
    for(j = 0; j < (n-1); j++){
        a[i,j] = rand();
    }
}

Неважно.Их количество одинаковое...

int** a;
int i;
printf("Enter array size: ");
scanf("%d", &n);
if( n < 1 ){
    printf("Size should be > 0\n\n");
    return NULL;
}
a = (int**)calloc(n, sizeof(int));
for(i = 0; i < n; i++)
    a[i] = (int*)calloc(n-1, sizeof(int));

Вот мой массив...

Сергей, вы не получили сообщение об ошибке с a[i,j] версия просто потому, что это совершенно верное выражение.Оператор запятой вычисляет подвыражения слева направо и возвращает значение последнего выражения.Таким образом, написание a[i,j] идентичен a[j].То, что вы получили на печати, было значением указателя на j-й вектор в вашей матрице.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top