统计随机数出现个数与直方图显示的C实现

Posted 山寺日高未起僧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了统计随机数出现个数与直方图显示的C实现相关的知识,希望对你有一定的参考价值。

要求

统计一列0-9的随机数,打印每个数字出现的次数,并用直方图的形式显示。

效果:

实现

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 20
#define R 10

int a[N];

void gen_random(int upper_bound)
{
	int i;
	srand(time(NULL));
	for(i=0;i<N;i++)
		a[i] = rand() % upper_bound;
}

int howmany(int value)
{
	int count = 0, i;
	for(i=0;i<N;i++)
		if(a[i]==value)
			++count;
	return count;
}

int find_max(int p[])
{
	int i, temp;
	for(i=1;i<R;i++)
	{
		if(p[0]<p[i])
			p[0]=p[i];
	}
	return p[0];
}

int main(void)
{
	int i, j, max, histogram[R]={0};
	gen_random(R);
	//statistics
	for(i=0;i<N;i++)
	{
		histogram[a[i]]++;
	}
	//raw data
	printf("num\\tfreq\\t\\n");
	for(i=0;i<R;i++)
	{
		printf("%d\\t%d\\t\\n", i, histogram[i]);
	}
	//find the maximum
	max = find_max(histogram);
	//histogram
	printf("\\nrandom histogram: \\n");
	for(i=0;i<R;i++)
		printf("%d\\t",i);
	printf("\\n");
	for(j=0;j<max;j++)
	{
		for(i=0;i<R;i++)
		{
			if(histogram[i]>0)
			{
				printf("*\\t");
				histogram[i]--;
			}else{
				printf(" \\t");
			}
		}
		printf("\\n");
	}
	return  0;
}

问题

实际效果是除了0的统计外,一切正常。而0的数字输出正常,直方图输出始终跟随最大值。

debug了一会,始终找不出原因,所有功能都正常,结果却出错,很烦。

解决

吃了口饭,重新梳理了思路,发现我刚开始的思路有问题,已知范围的情况下没必要排序数组的最大值,于是注释掉最大值代码,解决。

  1. 不需要max来限定
  2. max排序算法重构了histogram数组,使得histogram[0]始终是最大值

修改后的代码:Code

小结

  1. 算法知识很重要,解决问题的破题之笔
  2. 刚开始实现比优化重要
  3. 享受debug过程,ease yourself

效果

以上是关于统计随机数出现个数与直方图显示的C实现的主要内容,如果未能解决你的问题,请参考以下文章

直方图统计的FPGA实现

Opencv——直方图掩膜直方图均衡化详细介绍及代码实现

Opencv Cookbook阅读笔记:用直方图统计像素

C语言 随机数组排序

用C语言编程:在显示器上输入一段字符串,并统计出现字符的个数和各个字符出现的次数

R语言基础题及答案——R语言与统计分析第四章课后习题(汤银才)