Вопрос
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()
каждый раз через цикл - просто делайте это один раз заранее.
srand
это функция, которая "запускает" генератор случайных чисел.На случай, если вы не знаете, случайные числа в компьютерах на самом деле не случайны.По сути, у компьютера просто есть список чисел, которые кажутся в нем случайными, и вы используете srand
чтобы указать ему, с чего начать в этом списке, при каждом вызове rand()
возвращает следующий элемент в списке.
Причина, по которой вы пишете srand(time(NULL))
заключается в том, чтобы заставить случайные числа начинаться в какой-то момент, который не будет одинаковым каждый раз, когда вы запускаете программу (если только программы не запускаются в одно и то же время).
Итак, что вы здесь делаете, это многократно указываете программе перезапустить список случайных чисел в один и тот же момент (потому что время одно и то же каждый раз, когда вы проходите цикл).Переместите вызов в srand
выйдите за пределы цикла, и вы получите правильные результаты.
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-й вектор в вашей матрице.