Я пытаюсь написать программу, которая генерирует случайное число на основе внутренних часов системы таким образом, что мне не нужны ни начальное число, ни первое значение. Первое значение должно быть взято из внутренних часов путем преобразования года, месяца, дня, часов, минут, секунд в миллисекунды и добавления их к текущей миллисекунде, чтобы получить уникальное число (отметку времени). Любая помощь в получении этих значений на C?
Как получить текущую дату и время в миллисекундах в C
Ответы (3)
Вы можете использовать clock_gettime()
или _ 2_ - или, если вы находитесь в очень бедной среде, _ 3_ или _ 4_. Убедитесь, что вы используете достаточно большой тип данных, чтобы вместить миллиметр.
Для clock_gettime()
результатом будет struct timespec
с элементами tv_sec
и tv_nsec
. Вы бы использовали:
#include <time.h>
#include <stdint.h>
struct timespec t;
clock_gettime(CLOCK_REALTIME, &t);
int64_t millitime = t.tv_sec * INT64_C(1000) + t.tv_nsec / 1000000;
С gettimeofday()
(который официально устарел, но более широко доступен - например, Mac OS X имеет gettimeofday()
, но не имеет clock_gettime()
), у вас есть struct timeval
с членами tv_sec
и tv_usec
:
#include <sys/time.h>
#include <stdint.h>
struct timeval t;
gettimeofday(&t, 0);
int64_t millitime = t.tv_sec * INT64_C(1000) + t.tv_usec / 1000;
(Обратите внимание, что ftime()
был стандартным в более старых версиях POSIX, но больше не является частью POSIX, хотя некоторые системы по-прежнему предоставляют его для обратной совместимости. Он был доступен в ранних версиях Unix как средство первого субсекундного времени, но не как еще в 7-м издании Unix. Он был добавлен в POSIX (Single Unix Specification) для обратной совместимости, но вы должны стремиться использовать clock_gettime()
, если можете, и gettimeofday()
, если нет.)
clock_gettime()
(в системе Intel Xeon linux) всегда возвращает значение наносекунд, округленное до 250, поэтому вам может потребоваться разделить на 1000000, если вы используете эту часть результата. [РЕДАКТИРОВАТЬ - разделить на 1000 дает микросекунды, как указано ниже]
- person 6EQUJ5; 29.03.2014
int64_t
перед назначением. Использование суффикса LL
- это один из способов сделать это, и я бы использовал его, если бы тип millitime
был long long
. Но поскольку я использовал int64_t
, вероятно, лучше использовать макрос INT64_C()
, определенный в <stdint.h>
(вместе с int64_t
).
- person Jonathan Leffler; 29.03.2014
Стандарт C не гарантирует точность времени лучше секунды. Если вы используете систему POSIX, попробуйте часы * функции.
Если вы делаете это в Windows, вы можете использовать:
unsigned int rand = GetTickCount() % A_PRIME_NUMBER_FOR_EXAMPLE;
[Изменить: выделить по модулю что-то подходящее для ваших обстоятельств]