Случайные числа в C

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

a = (int**)calloc(n, sizeof(int));
for(i = 0; i < n; i++)
    a[i] = (int*)calloc(n-1, sizeof(int));

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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 один раз за пределами цикла.

Ответ 6

alt text

Ответ 7

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

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

Ответ 8

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

Не важно. Номер один и тот же...

Ответ 9

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

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

Ответ 10

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