【问题标题】:Evaluating variable if statement in C++在 C++ 中评估变量 if 语句
【发布时间】:2016-11-04 15:42:52
【问题描述】:

我正在尝试通过蒙特卡洛方法评估统计问题。在这个问题中,我生成一个随机数并将其与存储在名为comms_reliability 的向量数组中的固定概率数进行比较。假设向量数组中只有一个变量,我将比较随机数和概率,如果随机数大于可靠性数,则计算结果。但是,向量数组也可以有两个值,在这种情况下,我将生成两个随机数并将它们与两个可靠性数进行比较。如果两个随机数都大于可靠性数,我正在计算场景。理论上,对于向量数组中的任意多个值,这可以继续下去。但是,由于想象力的失败,我只知道如何在 for 语句包含在多个 if 语句中的情况下编写代码 对于每个可能的情况。在这个实现中,我必须多次复制相同的代码行,并且它还限制了 commms_reliability 数组大小,可以根据我复制这些代码行来处理下一个数组点的次数来评估这些大小。我怎么能做到这一点,我只需要一个 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;
        }

    }

【问题讨论】:

    标签: c++ c++11 if-statement for-loop


    【解决方案1】:

    如果我对您的理解正确,您希望确保comms_reliability 的所有元素满足每个样本的某些标准(即小于rang())。

    所以对所有元素进行循环并测试每个元素,或者只使用std::all_of

    // 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;
      }
    }
    

    您也可以使用之前定义的普通函数来代替 lambda 函数:

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

    注意:尝试改进你的变量/函数命名。

    【讨论】:

    • 这将解决问题,谢谢。此外,我还学到了一个以前不知道的新 C++ 功能。
    • 很高兴能为您提供帮助 :) 我添加了一个指向在线文档的链接,您可以在其中找到 C++ 标准库提供的许​​多其他“好东西”。
    【解决方案2】:

    使用标志来保留值

    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;
            }
    

    【讨论】:

      猜你喜欢
      • 2021-06-29
      • 2010-12-01
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多