8

我学到的方法是最初使用随机数生成器播种srand(time(NULL)),然后使用调用rand()来生成随机数。这种方法的问题是,如果我在同一秒内多次运行我的程序,生成的随机数将始终相同。有什么好的方法可以解决这个问题?

4

5 回答 5

6

在 POSIX 系统上,用于clock_gettime获取当前时间(以纳秒为单位)。如果你不需要很多位,你可以忘记 PRNG,直接使用时间的低位作为你的随机数。:-)

于 2013-04-06T03:46:47.007 回答
2

如果 *nix,你为什么不直接从 读取/dev/random

您还可以从其他设备收集噪音,例如键盘、鼠标或 CPU 温度。

您可以使用加速度计并用它来收集海浪中的噪音。风也会产生噪音。

我相信 Glib 提供了一个函数,g_random_int()它以快速和可移植的方式产生均匀分布的随机数。

或者您可以只读取临时​​文件的/tmp数量并使用该数量来提供srand()函数time.h,或者读取/tmp.

/usr/bin您可以从或读取每个文件/并为srand().

于 2013-04-06T05:00:13.827 回答
2
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。

于 2013-04-06T02:59:57.337 回答
1

除了使用时间之外,另一种为 rand 函数播种的常用方法是使用程序的进程 id,因为它保证是唯一的。

实际代码是平台相关的,但如果你在 Windows 上,我相信你可以使用 function GetCurrentProcessId(),如

srand(GetCurrentProcessId());
于 2013-04-06T02:51:26.777 回答
-2

除了输入时间,您还可以添加 CPU 时间,我相信这可以通过 clock() 来完成。所以它看起来像这样srand(time() + clock())

于 2013-04-06T02:58:40.040 回答