2012-02-12 124 views
0

我正在使用boost/random.hpp在间隔[1,3]上用随机数填充std :: map,并且将某种东西放在一起,这会使我得到每个计数相对于总数的百分比生成的数字的数量,但正在寻找一个可能更有效的方式来做到这一点。我一直在试图在助推库中找到某些东西,但无法找到完全相关的东西;有没有什么可以使用我的地图(我不想改变我的地图类型)并计算%或其他我应该考虑的东西?有没有更有效的方法来计算百分比?

int main() 
{ 
    std::map <int, long> results; 
    int current; 
    long one = 0; 
    long two = 0; 
    long three = 0; 
    long total = 0; 

    boost::random::mt19937 rng; 
    rng.seed(static_cast<boost::uint32_t> (std::time(0))); 
    boost::random::uniform_int_distribution<int> random(1,3); 

    for (int n = 0; n < 1000000; ++n) 
    { 
     current = random(rng); 
     ++total; 

     switch (current) 
     { 
      case 1: 
       ++one; 
       break; 
      case 2: 
       ++two; 
       break; 
      case 3: 
       ++three; 
       break; 
     } 
    } 

    results[1] = one; 
    results[2] = two; 
    results[3] = three; 

    std::cout << (double) results[1]/total*100 << std::endl; // etc. 
} 

编辑:我不想以任何方式更改地图容器。

+0

http://codereview.stackexchange.com – 2012-02-12 14:36:33

回答

2

你为什么不介绍它?直到你知道它是如何影响整个程序的速度的时候,没有必要优化百分比部分。例如,如果百分比只占节目时间的1%(大部分花费在随机数字生成中),那么即使效率提高一倍,速度也只会提高0.5%。

3

你说你不想改变地图类型,但我没有看到有很多理由使用地图来完成这项工作。看起来明显的选择将是一个载体:

static const unsigned total = 1000000; 

std::vector<unsigned> values(3); 

for (int i=0; i<total; i++) 
    ++values[random(rng)-1]; 

for (int i=0; i<values.size(); i++) 
    std::cout << (values[i] * 100.0)/total; 
1

高效?丢弃地图并将results声明为4个元素的数组:int results[4] = {0};,而不是使用开关/情况下,您可以直接执行++results[current]

+0

我不想更改地图部分。在地图以外有什么可以做的吗? – bqui56 2012-02-12 14:38:01

相关问题