种子srand()的最佳方法是什么?

时间:2013-04-06 02:42:18

标签: c random srand

我学习的方法是首先使用srand(time(NULL))为随机数生成器播种,然后使用rand()调用生成随机数。这种方法的问题是如果我在同一秒内多次运行我的程序,生成的随机数将始终相同。有什么好办法呢?

5 个答案:

答案 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())