我正在尝试编写一个程序,根据系统的内部时钟生成一个随机数,这样我就不需要种子或第一个值。必须从内部时钟获取第一个值,方法是将年,月,日,小时,分钟,秒转换为毫秒,并将它们添加到当前毫秒,以获得唯一编号(时间戳)。有什么帮助在C中获取这些值吗?
答案 0 :(得分:5)
您可以使用clock_gettime()
或
gettimeofday()
- 或者,如果您处于非常贫困的环境中,ftime()
或time()
。
确保您使用足够大的数据类型来保存毫秒。
对于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()
),您有{{1}成员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;
是旧版POSIX的标准版,但不再是POSIX的一部分,尽管有些系统仍会提供它以实现向后兼容性。它在早期版本的Unix中作为第一个子版本提供。第二次使用,但不早于第7版Unix。它被添加到POSIX(单一Unix规范)以实现向后兼容性,但如果可以的话,你应该使用ftime()
,如果可以,你应该clock_gettime()
#39; t)的
答案 1 :(得分:0)
标准C不能保证时间精度优于一秒。 如果您使用的是POSIX系统,请尝试the clock* functions。
答案 2 :(得分:0)
如果您碰巧在Windows中执行此操作,则可以使用:
unsigned int rand = GetTickCount() % A_PRIME_NUMBER_FOR_EXAMPLE;
[编辑:强调模块适合您的情况]