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的秒數,而後傳給sranddom

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 }

打印效果:spa

[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()//打印隨機數柱狀圖

函數中使用了製表符來控制字符間的間距,不知道衛什麼換成空格以後打印的直方圖就會出現變形錯位,各個數字出現的頻率不能正確對準,百思不得其解。code

相關文章
相關標籤/搜索