首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++中计算变量if语句

在C++中计算变量if语句
EN

Stack Overflow用户
提问于 2016-11-04 01:33:38
回答 2查看 58关注 0票数 0

我试图用蒙特卡罗方法来评估一个统计问题。在这个问题中,我生成一个随机数,并将其与存储在一个名为comms_reliability的向量数组中的固定概率数进行比较。假设向量阵中只有一个变量,我比较的是随机数和概率,如果随机数大于可靠性数,则计算结果。然而,向量数组也可能有两个值,在这种情况下,我产生两个随机数,并将它们与两个可靠性数进行比较。如果这两个随机数都大于可靠性数,我就是在计算这些情况。从理论上讲,这种情况可以在向量数组中的任意多个值中继续进行。但是,由于想象力的失败,我只知道如何对每个可能的场景中包含for语句的多个if语句进行编码。在这个实现中,我必须多次复制相同的代码行,它还限制了可以根据复制这些代码行以处理下一个数组点的次数来计算的commms_reliability数组大小。在我只需要一个if语句的情况下,我如何做到这一点。下面是我如何对其进行编码的一个示例。

代码语言:javascript
复制
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;
        }

    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-04 01:45:41

如果我正确地理解了您,您希望确保comms_reliability的所有元素都满足某些条件(即小于rang())。

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

代码语言:javascript
复制
// 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函数不同,您还可以使用以前在某个地方定义的普通函数:

代码语言:javascript
复制
bool is_reliable(float r) {
  return rang() > r;
}

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

票数 2
EN

Stack Overflow用户

发布于 2016-11-04 01:54:26

使用标志保留值

代码语言:javascript
复制
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;
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40413984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档