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