6

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

int rand_r(int *val);

我试图利用时间来播种这个功能,但我遇到了各种各样的麻烦。谁能向我解释我将如何使用时间调用 rand_r 或其他一些动态播种 rand_r 的简单方法。

谢谢!

4

2 回答 2

15

对于可重入版本rand_r,种子只是状态的初始值。每个线程需要一个种子。要么创建种子数组,要么将种子变量设为线程本地:

_Thread_local unsigned int seed = time(NULL);

int do_stuff()
{
    for ( ; ; )
    {
        int n = rand_r(&seed);
        // use n
    }
}
于 2012-10-13T02:53:09.277 回答
0

在 UNIX/POSIX 系统上,您可以打开/dev/urandom初始随机数,读取足够的字节以获取每个线程的种子。Microsoft Windows 有更复杂的方法来获取这些数字。查阅CryptGenRandom了解详情。由于这些是基于系统熵的,它们不适用于大量随机数。

于 2012-10-13T03:18:07.630 回答