我有一个多线程程序,每个线程调用函数erand48()来生成一个随机数。每个线程都有自己的私有随机种子,因此种子不会被共享。然而,erand48()并不像规范中所说的那样是线程安全的。
我尝试过用线程安全的erand48()代替random(),但是它要慢得多,性能是我首先考虑的问题。
我还会指定我不知道预先生成的值的数量,所以我不能像其他博客建议的那样预先生成所有的值。
对于erand48()是否有像它一样快的替代方案,线程安全吗?
发布于 2019-05-07 10:57:25
但是,erand48()并不像规范中所说的那样是线程安全的。
这是错误的,erand48()是专门作为一个线程安全版本的drand48()。引用开放群
通过使用不同的参数,erand48()、nrand48()和jrand48()允许大型程序的单独模块生成多个独立的伪随机数流,也就是说,每个流中的数字序列将不取决于调用例程多少次来为其他流生成数字。
您只需确保在每个线程中“播种”它,也许就像这里解释的那样:https://stackoverflow.com/a/26353855/4454124。
更新:按照POSIX,erand48()和类似的函数应该是线程安全的,但是看起来他们不是滑头的确实修改了全局随机生成器状态缓冲区。为了确保线程安全,可以使用变体,它是GNU扩展。生成器状态缓冲区与这些函数一起传入。
发布于 2019-05-07 11:24:22
你考虑过行码吗?你没说你想要的随机数发生器有多好。在许多统计测试中,较早版本的随机()并没有被认为是那么好。
如果您在维基百科上查找“随机数生成器列表”,列表的底部有"Xoroshiro128+“,它被描述为”现代64位CPU上最快的生成器之一“,它位于维基百科页面的链接之后,然后再到实现部分,您会发现列出了几个版本,包括C中的一个版本。也许可以在您的代码中进行修改,以确保它是线程安全的(没有静态变量)?
这里有一篇关于线程安全代码的文章,code.htm。
在线程安全随机数发生器上,这里是https://gist.github.com/carc1n0gen/1c3fe2fa5f1312993e1d
https://stackoverflow.com/questions/56020120
复制相似问题