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