2011-11-22 46 views
4

我最近学会了the hard way#<cstdlib> rand()不是线程安全的,在Linux上用互斥锁实现,当多线程调用rand()时造成瓶颈。 rand_r作为替代品,但有关于随机数生成质量的concerns。此外,这种情况让我质疑是否会有更快的随机数生成器,因为显然我的代码花费了大量的时间来生成随机数。上面的链接中列出了一些替代方案,但我不确定其速度以及其他替代方案。C++高效计算和线程安全随机函数

回答

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; 
} 

梅森倍捻机PRNG既快速又具有良好的统计特性。在每个线程中维护一个单独的(并分开播种的)引擎对象,可以避免所有并发问题。

+0

FPA再次,呵呵? ;) –

+0

@ R.MartinhoFernandes:Shhhh .... –

+0

@Kerrek的''使用梅森扭转者?它的速度与rand()相比如何?此外,新的随机数如何获得?我可以重复执行'= random_number',还是每次都必须执行'random_number = udist(rng);' –

2

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

+3

你不应该使用系统的熵来源*大*随机性。 'urandom'对于播种很好,但不适用于持续的随机数生成。就我所知,它甚至没有明确的分布。 –