码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-04-04 14:29:34      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:random   rand   ima   temp   man   pre   i++   问题   排序算法   

要求

统计一列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实现

标签:random   rand   ima   temp   man   pre   i++   问题   排序算法   

原文地址:https://www.cnblogs.com/vilogy/p/12631601.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!