• 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
    ",m);
    42     for (i = 0; i < UPPER;i++)
    43         printf("%d	",i);
    44         printf("
    ");
    45         printf("
    ");
    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("	");
    57         temp[j]--;
    58         }       
    59         printf("
    ");
    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	%d
    ",i,count(i));
    88    // printf("
    ");
    89     get_count();
    90     printf("value	howmany
    ");
    91     for (i = 0;i < UPPER;i++)
    92         printf("%d	%d
    ",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()//打印随机数柱状图

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

  • 相关阅读:
    Google Authentication 机制原理
    ldap日志
    ldap + kerberos 整合
    kerberos
    U盘格式化后的恢复
    初始化脚本(Os_Init_Optimization.sh)
    拿到新机器,进行初始化和部署Nginx的过程
    python 列表生成式
    python 装饰器
    简单总结无线CPE、无线AP、无线网桥的不同之处【转】
  • 原文地址:https://www.cnblogs.com/qinyg/p/3232459.html
Copyright © 2020-2023  润新知