C ++计算高效且线程安全的随机函数

时间:2011-11-22 20:18:56

标签: c++ multithreading random

我最近了解到the hard way #<cstdlib> rand()不是线程安全的,而且Linux是用互斥锁实现的,当多个线程经常调用rand()时会造成瓶颈。 rand_r可以替代,但concerns关于随机数生成的质量有{{3}}。此外,这种情况让我怀疑是否有更快的随机数生成器,因为显然我的代码花了很多时间生成随机数。上面的链接中列出了一些替代方案,但我不确定它们的速度以及可能存在的其他替代方案。

2 个答案:

答案 0 :(得分: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;
}

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

答案 1 :(得分:2)

在Linux中,您可以以非阻塞方式从/dev/urandom读取。