2015-10-21 5 views
1

Это мой код:Как работает srand()?

#include<stdio.h> 
#include<stdlib.h> 
#include <time.h> 
int main(){ 
float m, n; 
printf("Enter n, m:"); 
scanf("%f %f", &n, &m); 
int l; 
l=m-n; 
int i; 
for(i=0; i<4; i++){ 
    srand(time(NULL)); 
    double r=rand(); 
    r/=RAND_MAX; 
    r*=l; 
    r+=n; 
    printf("%f ", r); 
} 
return 0; 
} 

Почему он генерирует те же номера? и когда я пишу srand(time(NULL)); перед циклом, он генерирует разные числа! почему это так? как эта программа работает?

+0

Пытались ли вы 'человек srand' или даже Google? – John3136

+2

'time (NULL)', вероятно, даст вам одинаковое значение для каждой итерации вашего цикла (так как это секундная гранулярность). Таким образом, вы посеяны с одинаковым значением и сбрасываете последовательность 'rand' с каждым вызовом' srand'. Нет необходимости постоянно называть 'srand'. – kaylum

+0

@kaylum Вы ответили на другой вопрос. OP спрашивает, почему 'srand()' изменяет последовательность чисел. – John3136

ответ

1

Вызов time(NULL) возвращает текущее календарное время (в секундах с 1 января 1970 года). Итак, это то же самое семя, которое вы даете. Таким образом, rand дает такое же значение.

Просто вы можете использовать:

srand (time(NULL)+i); 
5

srand()Семена последовательность случайных чисел.

srand функция использует аргумент в качестве затравки для новой последовательности псевдослучайных чисел, которые будут возвращены при последующих вызовах rand. Если srand затем вызывается с тем же начальным значением, последовательность псевдослучайных чисел должна повторяться. ... C11dr §7.22.2.2 2

И time(), как правило, то же самое значение - для второго @kaylum

[Edit]

Лучше называть srand() только один раз в начале кода

int main(void) { 
    srand((unsigned) time(NULL)); 
    ... 

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

int main(void) { 
    // If code is not debugging, then seed the random number generator. 
    #ifdef NDEBUG 
    srand((unsigned) time(NULL)); 
    #endif 
    ...