C++计算有效和线程安全的随机函数

Mat*_*son 4 c++ random multithreading

笔者近日了解到硬盘的方式#<cstdlib> rand()不是线程安全的,并在Linux上与互斥实现,造成了瓶颈时,rand()由多个线程频繁调用.rand_r作为替代,但有人担心随机数生成的质量.此外,这种情况让我怀疑是否有更快的随机数生成器,因为显然我的代码花了很多时间生成随机数.上面的链接中列出了一些替代方案,但我不确定它们的速度以及可能存在的其他替代方案.

Ker*_* SB 11

如果您不需要线程进行任何统计控制,只需使用以下提供的工具<random>:

#include <random>

typedef std:::mt19937 rng_type;
std::uniform_int_distribution<rng_type::result_type> udist(0, 200);

int main()  // this can be per thread!
{
  rng_type rng;

  // seed rng first:
  rng_type::result_type const seedval = get_seed();
  rng.seed(seedval);

  rng_type::result_type random_number = udist(rng);

  return random_number;
}
Run Code Online (Sandbox Code Playgroud)

Mersenne twister PRNG速度快,具有良好的统计特性.在每个线程中维护一个单独的(和单独播种的)引擎对象可以避免所有并发问题.