我学习的方法是首先使用srand(time(NULL))
为随机数生成器播种,然后使用rand()
调用生成随机数。这种方法的问题是如果我在同一秒内多次运行我的程序,生成的随机数将始终相同。有什么好办法呢?
答案 0 :(得分:6)
在POSIX系统上,使用clock_gettime
以纳秒为单位获取当前时间。如果你不需要很多位,你可以忘记PRNG并直接使用时间的低位作为随机数。 : - )
答案 1 :(得分:2)
int pid ; // get it as per your OS
timeval t;
gettimeofday(&t, NULL);
srand(t.tv_usec * t.tv_sec * pid);
时间根据second
为您提供值。 gettimeofday基于microseconds
。因此同一种子发生的机会减少了。另外,您还使用了进程ID。
答案 2 :(得分:2)
如果是* nix,为什么不直接从/dev/random
阅读?
此外,您还可以从其他设备收集噪音,如键盘,鼠标或CPU温度。
您可以使用加速度计并使用它来收集海浪产生的噪音。风还会产生噪音。
我相信Glib提供了一个函数g_random_int()
,它可以快速便携地生成均匀分布的随机数。
或者您只需阅读/tmp
中的时态文件数量,然后使用该数字为srand()
函数提供time.h
,或者在{{1}中读取一个文件的内容}}
您可以阅读/tmp
或/usr/bin
中的每个文件,并为/
收集一些食物。
答案 3 :(得分:1)
除了使用时间之外,另一种播放rand函数的常用方法是使用程序的进程ID,因为它保证是唯一的。
实际代码与平台有关,但如果你在Windows上,我相信你可以使用函数GetCurrentProcessId()
,如
srand(GetCurrentProcessId());
答案 4 :(得分:-2)
除了输入时间之外,您还可以为此添加CPU时间,我相信可以使用clock()。
所以它看起来像这样:srand(time() + clock())
。