在多线程上下文中,随机生成器的替代方案与 erand48() 一样快?

abd*_*leb 0 c random multithreading thread-safety

我有一个多线程程序,其中每个线程调用函数 erand48() 来生成随机数。每个线程都有自己的私有随机种子,因此种子不会共享。但是,erand48()正如规范中所述,它不是线程安全的。

我尝试erand48()random()线程安全的替换,但它要慢得多,而且性能是我首先关心的问题。

我还要指出,我事先不知道生成的值的数量,因此我无法像其他博客建议的那样预先生成所有值

erand48() 是否有任何替代方案可以像它一样快并且是线程安全的?

mni*_*tic 5

但是,如规范中所述,erand48() 不是线程安全的。

这是错误的,erand48()是专门作为drand48(). 引用开放组的话:

通过使用不同的参数,erand48()、nrand48() 和 jrand48() 允许大型程序的单独模块生成多个独立的伪随机数流,即每个流中的数字序列不会取决于多少次调用例程来生成其他流的数字。

您只需确保在每个线程中“播种”它,也许如下所述: https: //stackoverflow.com/a/26353855/4454124


更新:erand48()根据 POSIX,类似的函数应该是线程安全的,但它们似乎不在 glibc 中,因为它们确实修改了全局随机生成器状态缓冲区。为了确保线程安全,您可以使用*_r变体,它们是GNU扩展。生成器状态缓冲区通过这些函数传入。