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

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

13 голосов
/ 15 марта 2010
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));

Ответы [ 10 ]

21 голосов
/ 15 марта 2010

Звоните srand() вне цикла. Вы повторяете это каждую итерацию.

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

6 голосов
/ 15 марта 2010

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

4 голосов
/ 15 марта 2010

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

3 голосов
/ 16 марта 2010

alt text

3 голосов
/ 15 марта 2010

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

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

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

2 голосов
/ 15 марта 2010
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 один раз за пределами цикла.

1 голос
/ 15 марта 2010

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

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

0 голосов
/ 16 марта 2010

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

0 голосов
/ 15 марта 2010
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));

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

0 голосов
/ 15 марта 2010
srand(time(NULL));
for(i = 0; i < n; i++){
    for(j = 0; j < (n-1); j++){
        a[i,j] = rand();
    }
}

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

...