我正在尝试编写一个程序,基于系统的内部时钟生成随机数,这样我就不需要种子或第一个值。 第一个值必须从内部时钟中获取,将年、月、日、小时、分钟、秒转换为毫秒,并将它们添加到当前毫秒中以获取唯一数字(时间戳)。 有什么帮助可以在 C 中获取这些值吗?
我正在尝试编写一个程序,基于系统的内部时钟生成随机数,这样我就不需要种子或第一个值。 第一个值必须从内部时钟中获取,将年、月、日、小时、分钟、秒转换为毫秒,并将它们添加到当前毫秒中以获取唯一数字(时间戳)。 有什么帮助可以在 C 中获取这些值吗?
clock_gettime()
或 gettimeofday()
,或者如果您处于非常贫困的环境中,则可以使用ftime()
或 time()
。请确保使用足够大的数据类型来存储毫秒级时间。clock_gettime()
,结果是一个具有tv_sec
和tv_nsec
元素的struct timespec
结构体。您可以使用以下方式:#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()
),您将获得一个具有tv_sec
和tv_usec
成员的struct timeval
结构体:
#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规范)以实现向后兼容性,但如果可以,请使用clock_gettime()
,如果不能,则使用gettimeofday()
。
clock_gettime()
总是返回四舍五入为250的纳秒值,因此如果使用结果的这部分,则可能需要除以1000000。[编辑-如下所指出,除以1000会产生微秒] - 6EQUJ5int64_t
。使用 LL
后缀是一种方法,如果 millitime
的类型是 long long
,那么我会使用这种方法。但由于我使用了 int64_t
,因此最好使用 <stdint.h>
中定义的 INT64_C()
宏(以及 int64_t
)。 - Jonathan Leffler标准C不能保证时间精度高于一秒。如果您使用的是POSIX系统,请尝试时钟*函数。
如果你在Windows上进行这个操作,你可以使用:
unsigned int rand = GetTickCount() % A_PRIME_NUMBER_FOR_EXAMPLE;
[编辑:强调取模运算符在您的情况下适当的使用]