c言語配列適用–乱数を統計してヒストグラムを印刷する
20990 ワード
C標準ライブラリで生成される疑似乱数は
int x = rand() % 10;
C標準ライブラリでは、自分で初期値を指定し、それに基づいて擬似乱数を生成できます.この初期値はSeedと呼ばれ、
srand(time(NULL));
小さなプログラムを書き、乱数を生産して印刷し、ヒストグラムを可視化して印刷します.
印刷効果:
問題1:
これは、注釈を追加するときに10行目のNの後ろに中国語のスペースを追加してしまい、コンパイルエラーが発生したためです.
問題2:
関数ではタブを使って文字間の間隔を制御していますが、何をスペースに変えたのか分からないと印刷されたヒストグラムに変形ずれが発生し、各数字の出現頻度が正しく合わず、理解できません.
rand
関数であり、この関数を使用するには、パラメータがなく、0とstdlib.h
の間のほぼ均一な分布の整数であるヘッダファイルRAND_MAX
を含む必要がある.RAND_MAX
は、ヘッダファイルで定義された定数であり、異なるプラットフォームでは異なる値が取られていますが、非常に大きな整数であることは間違いありません.通常、私たちが使用する乱数は、0~RAND_MAX
ではなく、0~9のような範囲に限定されています.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: [email protected] 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\t",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("\t"); 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\t%d
",i,count(i)); 88 // printf("
");
89 get_count(); 90 printf("value\thowmany
"); 91 for (i = 0;i < UPPER;i++) 92 printf("%d\t%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()//
関数ではタブを使って文字間の間隔を制御していますが、何をスペースに変えたのか分からないと印刷されたヒストグラムに変形ずれが発生し、各数字の出現頻度が正しく合わず、理解できません.