打印带C++的直方图

Printing Histogram with C++

本文关键字:直方图 C++ 打印      更新时间:2023-10-16

我正在尝试使用 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;
}

你的代码有很多问题,但由于这看起来像是你应该自己做的作业,所以我只解释观察到的行为:

在外部 for 循环的每次迭代中,list[i]最初设置为 0 到 1 之间的值。您的if状况可以缩短为list[i] >= 0. && list[i] < 1.。它将始终在循环的第一次迭代中匹配。但随后您将1添加到该值中。因此,它不会匹配该条件的任何后续评估,因为这样list[i]就是1 + original value of list[i],它不在 0 和 1 之间。

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

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

  2. 不应嵌套 for 循环

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

  3. if条件

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

    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]++;
    

有关更多信息,请参阅

  • OpenCV 绘制 2D 直方图

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