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
dom
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
* * * * * * * * * *
* * * * * * * * * *
* * * * * * * * * *
* * * * * * * * * *
* * * * * * * * * *
* * * * * * * * * *
* * * * * * * *
* * * * * * * *
* * * * * *
* * * * *
* * * *
* * *
* *
* *
* *
[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 後面添加了一個漢語的空格,致使編譯出錯。指針
void print_random()//打印隨機數柱狀圖
函數中使用了製表符來控制字符間的間距,不知道衛什麼換成空格以後打印的直方圖就會出現變形錯位,各個數字出現的頻率不能正確對準,百思不得其解。code