繁体   English   中英

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

[英]Properly seeding rand_r(int *val) method

所以我有多个线程将使用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了解详细信息。 由于这些是基于系统熵,因此它们不适用于高容量随机数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM