2012-02-12 178 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

相關問題