在C语言中,一般使用 <stdlib.h> 头文件中的 rand() 函数来生成随机数:
int rand (void);
种子在每次启动计算机时是随机的,但是一旦计算机启动以后它就不再变化了;也就是说,每次启动计算机以后,种子就是定值了,所以根据公式推算出来的结果(也就是生成的随机数)就是固定的。
可以通过 srand() 函数来重新“播种”,这样种子就会发生改变。
void srand (unsigned int seed);
使用 <time.h> 头文件中的 time() 函数即可得到当前的时间(精确到秒)
srand((unsigned)time(NULL));
生成一定范围内的随机数
int a = rand() % 10; //产生0~9的随机数,注意10会被整除
每次生成0-99范围内的随机数。
代码示例:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <time.h>
4 enum DAY{ MON =1,TUE,WED,THU,FRI,SAT,SUN};
5
6 int main()
7 {
8 int sum =18,cnt =3;
9 double mean;
10 enum DAY day;
11 int i;
12 int a;
13 srand((unsigned)time(NULL));
14 a =rand()%100;
15
16 mean=(double)sum/cnt;
17 printf("mean is %f\n",mean);
18 printf("day is %d\n",day);
22 printf("a is %d\n",a);
23 return 0;
24 }
连续生成随机数:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <time.h>
4 enum DAY{ MON =1,TUE,WED,THU,FRI,SAT,SUN};
5
6 int main()
7 {
8 int sum =18,cnt =3;
9 double mean;
10 enum DAY day;
11 int i;
12 int a;
13 srand((unsigned)time(NULL));
14 // a =rand()%100;
15
16 mean=(double)sum/cnt;
17 printf("mean is %f\n",mean);
18 printf("day is %d\n",day);
19 for (i=0;i<10;i++){
20 // srand((unsigned)time(NULL));
21 a =rand()%100;
22 printf("a is %d\n",a);
23 }
24 return 0;
25 }
结果:
accu@ubuntu:~/C/CEX/ex8_int$ ./a.out
mean is 6.000000
day is -1763155424
a is 69
a is 69
a is 69
a is 69
a is 69
a is 69
a is 69
a is 69
a is 69
a is 69
accu@ubuntu:~/C/CEX/ex8_int$ vim main.c
accu@ubuntu:~/C/CEX/ex8_int$ gcc main.c
accu@ubuntu:~/C/CEX/ex8_int$ ./a.out
mean is 6.000000
day is 608382928
a is 7
a is 40
a is 34
a is 47
a is 58
a is 66
a is 99
a is 24
a is 52
a is 65
放在循环内不能生成随机数,因为srand语句在循环内,每一次都用时间做种,程序执行速度很快,所以获取时间精度内,数值不变,于是每一次循环都是一样的,如果把srand()放在循环外,就能产生不同的不同的序列。