正确播种rand_r(int * val)方法

时间:2012-10-13 02:44:09

标签: c pointers

所以我有多个线程将使用rand_r函数。该功能的签名是:

int rand_r(int *val);

我试图利用时间播种这个功能,但我遇到了各种各样的麻烦。任何人都可以向我解释如何使用时间调用rand_r,或者以其他简单方式动态调度rand_r。

谢谢!

2 个答案:

答案 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 了解详细信息。由于这些是基于系统熵,因此不适用于高容量随机数。