对于这个程序,我的意思是生成一定数量的具有给定范围的随机整数。例如,在0-10之间的100英寸。
我创建了一个分布数组(称为distTab),它显示了生成某个数字的次数。然后我将数字打印为for循环中的星号。检查下面的图片。
这适用于0-10但是说我在0-1000之间生成10000个数字我的打印功能会打印distTab的每个索引。我想按范围剪切并在该范围内相互添加索引值。例如在0-100之间 - > 20星,101-200 - > 21星等等。
这是我目前打印直方图的代码:
int inc=0;
printf("\n%s\t%s\n","Number", "Histogram\n");
for(int i=0; i <= max; i++) {
if(distTab[i]==0)
continue;
printf(" %d\t",i);
int lim = distTab[i];
for(int j=1; j<=lim; j++){
printf("*");
inc++;
}
printf("\n");
}
随机数和distTab就像这样创建(在for循环中):
int distTab[MAX_RAND];
memset(distTab, 0, sizeof distTab);
//for(0 -> desired number of ints)
rnd = (rand() % limit)+1;
if (max < rnd)
max = rnd; //max value generated.
distTab[(int)rnd]++;
//}
提前感谢您的时间,我希望尽可能清楚地解释我的问题。
答案 0 :(得分:0)
缩放直方图。或者甚至更好地以百分比打印它。 我会做类似
的事情lim = distTab[i] / max_distTab * max_lim;
这样,您最常用的值总是与之相同。
答案 1 :(得分:0)
以下是我将如何处理0到9999之间的数字以及范围100:
int inc=0;
int count[10] = {0};
printf("\n%s\t%s\n","Number", "Histogram\n");
for(int i = 0; i <= max; i++) {
if(distTab[i]==0)
continue;
count[max % 100] += distTab[i];
}
for (int i = 0; i < 10; ++i){
printf("%4d-%4d\t",i * 100, (i + 1) * 100);
int lim = count[i];
for(int j=1; j<=lim; j++){
printf("*");
inc++;
}
printf("\n");
}
我使用硬值来避免变量长度数组,但更好的做法是malloc你的数组或使用define。
如果你想要一个自定义范围,你也可以使用另一个排序的int数组:
int ranges[] = {100, 300, 450, 600, 1000};
// assuming ranges is sorted
int get_index(int value, int* ranges){
int count = 0;
if (value > ranges[ranges.size() - 1])
return -1;
while (value < ranges[count])
++count;
return count;
}
并替换
for(int i = 0; i <= max; i++) {
if(distTab[i]==0)
continue;
count[max % 100] += distTab[i];
}
通过:
for(int i = 0; i <= max; i++) {
if(distTab[i]==0)
continue;
count[get_index(i, ranges)] += distTab[i];
}