c语言数组应用--统计随机数并打印直方图


C标准库中生成伪随机数的是rand函数,使用这个函数需要包含头文件stdlib.h,它没有参数,返回值是一个介于0和RAND_MAX之间的接近均匀分布的整数。RAND_MAX是该头文件中定义的一个常量,在不同的平台上有不同的取值,但可以肯定它是一个非常大的整数。通常我们用到的随机数是限定在某个范围之中的,例如0~9,而不是0~RAND_MAX,我们可以用%运算符将rand函数的返回值处理一下:

int x = rand() % 10;

C标准库允许我们自己指定一个初值,然后在此基础上生成伪随机数,这个初值称为Seed,可以用srand函数指定Seed。通常我们通过别的途径得到一个不确定的数作为Seed,例如调用time函数得到当前系统时间距1970年1月1日00:00:00的秒数,然后传给srand

srand(time(NULL));

写一个小程序,生产随机数并打印出来,并以可视化的形式打印直方图:

value	how many
0	10130
1	10072
2	9990
3	9842
4	10174
5	9930
6	10059
7	9954
8	9891
9	9958

0  1  2  3  4  5  6  7  8  9

*  *  *  *     *  *  *     *
*     *  *     *  *  *     *
      *  *        *
                  *
                  *

 1 /*************************************************************************  2  > File Name: random.c  3  > Author: qin  4  > Mail: qin11745@gmail.com  5  > Created Time: 2013年08月02日 星期五 09时23分46秒  6  ************************************************************************/
 7 
 8 #include<stdio.h>
 9 #include<stdlib.h>
10 #define N 100//定义保存随机数数组的大小(产生N个随机数)
11 #define C 100//定义保存各个随机数出现的次数的数组的大小
12 #define UPPER 10 //定义随机数的最大值(使随机数在0-UPPER之间,UPPER<=20&&UPPER<=N)
13 
14 int a[N];//保存随机数的数组
15 int histogram[C];//保存各个随机数个数的数组
16 
17 void get_random(int upper_bound)//获取0-upper_bound内的随机数
18 { 19     int i; 20  srand(time(NULL)); 21     for (i = 0; i < N ;i++) 22         a[i] = rand() % upper_bound; 23 } 24 
25 int get_max(int a[],int num)//获取一个数组之中的最大值
26 { 27     int i; 28     int max; 29     max = a[0]; 30     for(i = 1; i< num ;i++) 31         if(max<a[i]) 32             max=a[i]; 33     return max; 34 } 35 
36 void print_random()//打印随机数柱状图
37 { 38     int i,j,m; 39     m = get_max(&histogram,N); 40     int temp[N]; 41     printf("max is %d\n",m); 42     for (i = 0; i < UPPER;i++) 43         printf("%d\t",i); 44         printf("\n"); 45         printf("\n"); 46     for (i = 0; i < N;i++) 47         temp[i] = histogram[i]; 48 
49     for (i = 0; i < m ;i++) 50  { 51         for(j = 0; j < N;j++) 52  { 53            //printf("%d",temp[j]);
54             if((temp[j])>0) 55                 printf("*"); 56             printf("\t"); 57         temp[j]--; 58  } 59         printf("\n"); 60  } 61     
62 } 63 
64 /*
65 int count(int value)//统计各个数的出现次数(效率低下) 66 { 67  int count =0,i; 68  for(i = 0;i < N;i++) 69  if(a[i] == value) 70  ++count; 71  return count; 72 } 73 */
74 
75 void get_count()//获取每个数字的出现频率(利用a[i]的值作为histogram[]的下标)
76 { 77     int i = 0; 78     for(i = 0; i < N;i++) 79         histogram[a[i]]++; 80 } 81 
82 int main(void)//主函数
83 { 84     int i = 0; 85  get_random(UPPER); 86    // for(i = 0; i < 10 ;i++) 87    // printf("%d\t%d\n",i,count(i)); 88    // printf("\n");
89  get_count(); 90     printf("value\thowmany\n"); 91     for (i = 0;i < UPPER;i++) 92         printf("%d\t%d\n",i,histogram[i]); 93  print_random(); 94     return 0; 95 }

打印效果:

[qin@localhost c]$ ./random value howmany 0       6
1       11
2       15
3       9
4       6
5       8
6       12
7       8
8       15
9       10 max is 15
0       1       2       3       4       5       6       7       8       9

*       *       *       *       *       *       *       *       *       *
*       *       *       *       *       *       *       *       *       *
*       *       *       *       *       *       *       *       *       *
*       *       *       *       *       *       *       *       *       *
*       *       *       *       *       *       *       *       *       *
*       *       *       *       *       *       *       *       *       *
        *       *       *               *       *       *       *       *
        *       *       *               *       *       *       *       *
        *       *       *                       *               *       *
        *       *                               *               *       *
        *       *                               *               *
                *                               *               *
                *                                               *
                *                                               *
                *                                               *

遇到的问题1:

[qin@localhost c]$ gcc random.c -o random random.c:10:10: 警告:宏名后缺少空白 [默认启用] random.c:14:1: 错误:程序中有游离的‘\343’ random.c:14:1: 错误:程序中有游离的‘\200’ random.c:14:1: 错误:程序中有游离的‘\200’ random.c: 在函数‘get_random’中: random.c:21:5: 错误:程序中有游离的‘\343’ random.c:21:5: 错误:程序中有游离的‘\200’ random.c:21:5: 错误:程序中有游离的‘\200’ random.c: 在函数‘print_random’中: random.c:39:5: 错误:程序中有游离的‘\343’ random.c:39:5: 错误:程序中有游离的‘\200’ random.c:39:5: 错误:程序中有游离的‘\200’ random.c:39:5: 警告:传递‘get_max’的第 1 个参数时在不兼容的指针类型间转换 [默认启用] random.c:25:5: 附注:需要类型‘int *’,但实参的类型为‘int (*)[100]’ random.c:40:5: 错误:程序中有游离的‘\343’ random.c:40:5: 错误:程序中有游离的‘\200’ random.c:40:5: 错误:程序中有游离的‘\200’ random.c:46:5: 错误:程序中有游离的‘\343’ random.c:46:5: 错误:程序中有游离的‘\200’ random.c:46:5: 错误:程序中有游离的‘\200’ random.c:51:9: 错误:程序中有游离的‘\343’ random.c:51:9: 错误:程序中有游离的‘\200’ random.c:51:9: 错误:程序中有游离的‘\200’ random.c: 在函数‘get_count’中: random.c:78:5: 错误:程序中有游离的‘\343’ random.c:78:5: 错误:程序中有游离的‘\200’ random.c:78:5: 错误:程序中有游离的‘\200

这是因为在添加注释的时候不小心在第10行的 N 后面添加了一个汉语的空格,导致编译出错。

遇到的问题2:

void print_random()//打印随机数柱状图

函数中使用了制表符来控制字符间的间距,不知道卫什么换成空格之后打印的直方图就会出现变形错位,各个数字出现的频率不能正确对准,百思不得其解。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM