2012-02-12 13 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 –

答えて

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

関連する問題