我学习的方法是使用srand(time(NULL))
初始化随机数生成器,然后使用rand()
调用来生成随机数。但这种方法的问题在于,如果我在同一秒钟内多次运行程序,则生成的随机数将始终相同。有什么好的解决方法吗?
clock_gettime
来获取当前时间的纳秒表示。如果您不需要很多比特数,可以忽略PRNG,直接使用时间的低位作为您的随机数。 :-)/dev/random
读取随机数呢?g_random_int()
,可以快速和可移植地生成等分布的随机数。/tmp
中的临时文件编号,并使用该编号通过time.h
函数来提供给srand()
,或者读取/tmp
中的一个文件内容。/usr/bin
或/
中读取每个文件,并收集一些内容为srand()
提供数据。srand(GetCurrentProcessId());
int pid ; // get it as per your OS
timeval t;
gettimeofday(&t, NULL);
srand(t.tv_usec * t.tv_sec * pid);
time函数的返回值是以秒
为单位的。而gettimeofday函数则是以微秒
为单位的,这意味着种子出现重复的可能性更小了。另外,还使用了当前进程的ID。
t.tv_usec * t.tv_sec * pid
这个选择不够理想。当传递给 srand(unsigned)
时,该乘积会被转换为 unsigned
类型。3个数的乘积中的每个2的幂值都会减少种子可用的位数。相反,应该使用 ^
运算符:t.tv_usec ^ t.tv_sec ^ pid
。 - undefinedsrand(time() + clock())
。
GetTickCount
。*nix有clock_gettime。 - chrisstime(time(NULL) * getpid())
就可以达到目的。 - Havenard