【问题标题】:c++11 STL's binomial_distribution extremely slowc++11 STL的binomial_distribution极慢
【发布时间】:2012-10-21 05:27:43
【问题描述】:

我正在使用 STL 的“随机”生成二项式分布的随机数。当范围很大时,它变得非常慢。对于范围 40,生成 100 个数字需要 12 秒。对于更大的范围,时间会急剧增加(我需要大约 10000 的范围)。它似乎不依赖于概率参数。我正在使用 g++ 4.5.0。

#include <iostream>
#include <random>

using namespace std;

vector<int> v;

default_random_engine gen(123);
binomial_distribution<int> rbin(40,0.7);

int main(){
  v.reserve(2000);
  for(int i=0; i<100;++i){
    v.push_back(rbin(gen));
   }
}

输出:

50.~/.../fs/> g++ -std=c++0x q.cpp 
51.~/.../fs/> time ./a.out 
real    0m12.102s
user    0m12.094s
sys     0m0.002s
52.~/.../fs/>

我可以使用正态近似,但它对概率参数的极值不利。

更新:

使用“-O3”选项,时间变为约 2 秒。在 g++ 4.6.3 中,问题完全消失了——范围几乎没有任何时间依赖性,生成 100 个数字需要 5 毫秒。

【问题讨论】:

  • 你的问题是......?

标签: c++ gcc random c++11 libstdc++


【解决方案1】:

对于大范围,libstdc++ 将使用有效的拒绝算法(在 Devroye, L. 非均匀随机变量生成之后),但前提是 C99 TR1 数学可用 (_GLIBCXX_USE_C99_MATH_TR1)。否则,它会退回到一个简单的等待时间方法,这将在该范围内具有线性性能。

我建议检查 _GLIBCXX_USE_C99_MATH_TR1 的值,以及性能是否比更新的 g++ 版本有所提高。

【讨论】:

    【解决方案2】:

    您应该确保在性能很重要时启用优化。

    您还应该查看可用的随机数引擎,并确保您使用的是满足您的性能/大小/质量要求的引擎。

    如果问题确实是std::binomial_distribution::operator() 性能不佳,您可能必须使用不同的标准库实现,或std::binomial_distribution 的替代实现。 boost 应该有 &lt;random&gt; 的替代实现,您应该可以毫不费力地使用它,libc++ 也有替代实现,但它会更难使用,因为您必须替换整个标准库实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-19
      • 2016-01-13
      • 1970-01-01
      • 2013-12-04
      • 2013-07-02
      • 1970-01-01
      • 2013-07-10
      相关资源
      最近更新 更多