前言
通常想要使用随机数的时候,在网络上搜索,他们只会告诉你用srand播种。 而且是以秒为单位,这就有了个巨大的问题,而且这个问题在Windows系统中不算常见但是在Linux中的必出的问题。
通常网上的教程会教你这么写随机种子
srand((unsigned)time(NULL));
这样写没什么问题,但是如果你想执行一个非常快的语句,比如for循环,就会出现问题。 比如下面这段代码
int arr[4096];
for(int x = 0; x < 4096; ++x) {
arr[x] = rand();
}
此段代码在Windows中表示的可能不是特别明显,但在Linux中你就会发现输出的几乎都是同一个值。 为什么呢?因为它以秒为单位,而for循环执行的速度是非常快的。
代码
我们自己编写一个随机数种子播种函数,然后在需要使用随机数时调用一次它。 这个随机数种子是以纳秒为单位的,就完美避免了以秒为单位出现的更新不及时的情况。
#include <sys/timeb.h>
#include <time.h>
static void setRandomSeed()
{
clockid_t a = 0;
struct timespec p = {0, 0};
clock_gettime(a, &p);
srand((unsigned)p.tv_nsec);
}
此代码专门针对不同系统进行过改动,比如你可以将这段代码原封不动的从Windows移植到Linux中,执行不会出现任何问题。
|