我学到的方法是最初使用随机数生成器播种srand(time(NULL))
,然后使用调用rand()
来生成随机数。这种方法的问题是,如果我在同一秒内多次运行我的程序,生成的随机数将始终相同。有什么好的方法可以解决这个问题?
5 回答
在 POSIX 系统上,用于clock_gettime
获取当前时间(以纳秒为单位)。如果你不需要很多位,你可以忘记 PRNG,直接使用时间的低位作为你的随机数。:-)
如果 *nix,你为什么不直接从 读取/dev/random
?
您还可以从其他设备收集噪音,例如键盘、鼠标或 CPU 温度。
您可以使用加速度计并用它来收集海浪中的噪音。风也会产生噪音。
我相信 Glib 提供了一个函数,g_random_int()
它以快速和可移植的方式产生均匀分布的随机数。
或者您可以只读取临时文件的/tmp
数量并使用该数量来提供srand()
函数time.h
,或者读取/tmp
.
/usr/bin
您可以从或读取每个文件/
并为srand()
.
int pid ; // get it as per your OS
timeval t;
gettimeofday(&t, NULL);
srand(t.tv_usec * t.tv_sec * pid);
time 为您提供基于second
. gettimeofday 基于microseconds
. 因此,发生相同种子的可能性较小。另外,您还使用了进程 ID。
除了使用时间之外,另一种为 rand 函数播种的常用方法是使用程序的进程 id,因为它保证是唯一的。
实际代码是平台相关的,但如果你在 Windows 上,我相信你可以使用 function GetCurrentProcessId()
,如
srand(GetCurrentProcessId());
除了输入时间,您还可以添加 CPU 时间,我相信这可以通过 clock() 来完成。所以它看起来像这样srand(time() + clock())
: