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()//打印随机数柱状图
函数中使用了制表符来控制字符间的间距,不知道卫什么换成空格之后打印的直方图就会出现变形错位,各个数字出现的频率不能正确对准,百思不得其解。