time()
имеет разрешение 1 секунда.Таким образом, ваша программа будет генерировать другое значение только через полсекунды в среднем.
Если ваш компилятор поддерживает C11, вы можете использовать функцию с более высоким разрешением, timespec_get()
.Ваш srand(time(0));
будет преобразован в следующее:
struct timespec ts;
timespec_get(&ts, TIME_UTC);
srand(ts.tv_nsec);
Здесь ts.tv_nsec
- это наносекундная часть метки времени, разрешение которой должно быть достаточно для вашей цели.
Есливаш компилятор не поддерживает C11, вы все равно можете иметь лучший источник случайного начального числа, чем time()
, с разрешением около миллисекунды (фактическое разрешение задается макросом CLOCKS_PER_SEC
): функция clock()
.Тогда ваш код заполнения будет
srand(clock());
Обратите внимание, что на самом деле он может быть плохим источником энтропии, особенно если ваша ОС не занята, так что программа будет работать в несколько предсказуемом темпе.Это потому, что начало эры clock()
связано с выполнением программы, а не с реальным временем.Возможно, было бы лучше, например, использовать сумму clock()
и time(0)
, чтобы получить более непредсказуемое значение:
srand(time(0)+clock());