首页 > 解决方案 > 用 C++ 打印直方图

问题描述

我正在尝试使用 for 循环打印直方图,但是由于某种原因,我的第二个循环应该根据 if 条件运行,但它不起作用,我最终"#"每个计数器只有 1 个。

#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;

int main () {

char hash = '#';                                
double list[10];                                
int size = sizeof(list) / sizeof(list[0]);      

for(int i = 0; i < size; i++) {                 
  list[i] = ((rand() % 10000) / 10000.0);       

  for(int j = 0; j < 10000; j++) {              
    if
    (      
        (list[i] >= 0 && list[i] <= .1) ||
        (list[i] >= .1 && list[i] <= .2) || 
        (list[i] >= .2 && list[i] < .3) ||
        (list[i] >= .3 && list[i] < .4) ||
        (list[i] >= .4 && list[i] < .5) ||
        (list[i] >= .5 && list[i] < .6) ||
        (list[i] >= .6 && list[i] < .7) ||
        (list[i] >= .7 && list[i] < .8) ||
        (list[i] >= .8 && list[i] < .9) ||
        (list[i] >= .9 && list[i] < 1.0)
    ) 
      {
      list[i] += 1;             
    }
  }
}

cout << "HISTOGRAM OF 10 COUNTERS " << endl;
for(int i = 0; i < size; i++) {

  cout << "[" << i << "] \t" << list[i] << "\t" << string(list[i], hash) << endl;
}

  return 0;
}

标签: c++algorithmloopshistogram

解决方案


  1. 您正在使用list[]随机数和直方图

    那是错的!随机值应存储在 temp 变量中,并在主循环 ( j<10000) 中生成。

  2. for 循环不应该嵌套

    第一个 ( i<10) 应该只是将您的直方图清除为零。第二个应该生成您的随机值,从中计算直方图 bin 索引并将 bin 计数增加一。

  3. if条件

    是不完整的,它应该是(size=10)个人或if/else计算i索引的条件。它还应该使用临时随机值而不是直方图值:

    random_value=((rand()%10000)/10000.0);
    i=-1;if (random_value<0.0);
    else if (random_value<0.1) i=0;
    else if (random_value<0.2) i=1;
    else if (random_value<0.3) i=2;
    ...
    else if (random_value<1.0) i=9;
    if (i>=0) list[i]++;
    

    但是,您的随机值在范围内<0.0,1.0),因此可以通过以下方式完全删除 ifs:

    random_value=((rand()%10000)/10000.0);
    i=floor(random_value*double(size));
    list[i]++;
    

有关更多信息,请参阅

您可以在那里找到 C++ 直方图示例 ..


推荐阅读