所以我有多个线程将使用 rand_r 函数。这个函数的签名是:
int rand_r(int *val);
我试图利用时间来播种这个功能,但我遇到了各种各样的麻烦。谁能向我解释我将如何使用时间调用 rand_r 或其他一些动态播种 rand_r 的简单方法。
谢谢!
对于可重入版本rand_r
,种子只是状态的初始值。每个线程需要一个种子。要么创建种子数组,要么将种子变量设为线程本地:
_Thread_local unsigned int seed = time(NULL);
int do_stuff()
{
for ( ; ; )
{
int n = rand_r(&seed);
// use n
}
}
在 UNIX/POSIX 系统上,您可以打开/dev/urandom
初始随机数,读取足够的字节以获取每个线程的种子。Microsoft Windows 有更复杂的方法来获取这些数字。查阅CryptGenRandom了解详情。由于这些是基于系统熵的,它们不适用于大量随机数。