Как работает 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)); перед циклом, он генерирует разные числа! почему это так? как работает эта программа?


person fatisati    schedule 21.10.2015    source источник
comment
Вы пробовали man srand или даже гугл?   -  person John3136    schedule 21.10.2015
comment
time(NULL), вероятно, даст вам одно и то же значение для каждой итерации вашего цикла (поскольку это секундная гранулярность). Таким образом, вы заполняете одно и то же значение и сбрасываете последовательность rand с каждым вызовом srand. Нет необходимости постоянно вызывать srand.   -  person kaylum    schedule 21.10.2015
comment
@kaylum Вы ответили на другой вопрос. ОП спрашивает, почему srand() меняет числовую последовательность.   -  person John3136    schedule 21.10.2015
comment
@John3136 John3136 Наверное, я имел в виду, почему он генерирует одно и то же число?. Причина в том, что srand сбрасывает последовательность каждый раз, когда она вызывается. Таким образом, с одним и тем же семенем последовательность rand будет каждый раз одинаковой.   -  person kaylum    schedule 21.10.2015


Ответы (2)


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

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

 srand (time(NULL)+i);
person Chand Priyankara    schedule 21.10.2015

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

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

И time() обычно имеет одно и то же значение - на секунду @kaylum

[Редактировать]

Лучше вызывать 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
  ...
person chux - Reinstate Monica    schedule 21.10.2015