2016-11-04 4 views
0

モンテカルロ法で統計問題を評価しようとしています。この問題では、乱数を生成し、それをcomms_reliabilityという名前のベクトル配列に格納された固定確率数と比較しています。ベクトル配列に変数が1つしかないと仮定すると、乱数と信頼度を比較し、乱数が信頼度よりも大きい場合は結果を集計しています。しかし、ベクトル配列は2つの値を持つこともできます。この場合、2つの乱数を生成して2つの信頼性数値と比較します。両方の乱数が信頼性の数値より大きい場合、私はシナリオを集計しています。理論的には、これはベクトル配列内の多くの値に対して必要なだけ繰り返してもかまいません。しかし、想像力の欠如により、私は、for文が複数のif文に含まれている箇所をコード化する方法しか知りません 考えられる各シナリオについてこの実装では、同じコード行を複数回コピーする必要があります。また、次の配列ポイントを処理するためにこれらの行をコピーした回数に基づいて評価できる配列サイズはcommms_reliabilityに制限されています。 if文が1つだけ必要な場合は、どうやってこれを行うことができますか?現在どのようにコード化しているかの例を以下に示します。私はあなたがcomms_reliabilityのすべての要素がいくつかの基準を満たすことを確認するには、正しくあなたを理解していればC++で変数if文を評価する

int main(int argc, const char * argv[]) { 
    int sample_size  = 1000000; 
    std::vector<float> comms_reliability = {0.6,0.6}; 
    float tally = 0.0; 

    // rang() = random number generator 
    // if statement for comms_reliability array of size 1 
    if (comms_reliability.size() == 1) { 
     for (int i = 0; i < sample_size; i++){ 
      if (rang() > comms_reliability[0]) tally = tally + 1.0; 
     } 

    } 
    // if statement 2 for comms_reliability array of size 2 
    if (comms_reliability.size() == 2) { 
     for (int i = 0; i < sample_size; i++){ 
      if (rang() > comms_reliability[0] && rang() > comms_reliability[1]) tally = tally + 1.0; 
     } 

    } 
    // if statement 3 for comms_reliability array of size 3 
    if (comms_reliability.size() == 3) { 
     for (int i = 0; i < sample_size; i++){ 
      if (rang() > comms_reliability[0] && rang() > comms_reliability[1] && 
      rang() > comms_reliability[2]) tally = tally + 1.0; 
     } 

    } 

答えて

2

各試料について(すなわち未満rang()です)。

だから、すべての要素をループを作り、それぞれをテストし、あるいは単に使用std::all_of

bool is_reliable(float r) { 
    return rang() > r; 
} 

:代わりに、あなたも前にどこかで定義された正常な機能を使用することができますラムダ関数の

// Lambda function used to test a single comm_reliability 
auto is_reliable = [] (float r) { return rang() > r; }; 
// Iterate over your samples 
for (int i = 0; i < sample_size; ++i) { 
    // If all elements satisfy your criterion ... 
    if (std::all_of(std::begin(comms_reliability), 
        std::end(comms_reliability), 
        is_reliable)) { 
    // .. perform your action 
    tally += 1.0; 
    } 
} 

注:変数/関数の名前付けを改善してください。

+0

を維持するためにフラグを使用します。さらに私は以前に存在しなかった新しいC++機能を学びました。 – Jon

+0

私はあなたを助けることができてうれしいです:)私はC++標準ライブラリが提供する他の多くの「おいしさ」を見つけることができるオンラインドキュメントへのリンクを追加しました。 –

0

はあなたに感謝し、問題を解決する値

int main(int argc, const char * argv[]) { 
    int sample_size  = 1000000; 
    std::vector<float> comms_reliability = {0.6,0.6}; 
    float tally = 0.0; 

    // rang() = random number generator 

     for (int i = 0; i < sample_size; i++){ 
      boolean flag = true; 
      for(int j = 0; j < comms_reliability.size(); j++) 
      { 
       if (rang() <= comms_reliability[j]) 
       { 
        flag = false; 
        break; 
       } 
      } 
      tally = flag ? tally + 1.0 : tally; 
     } 
関連する問題