|
函数原型:
#include <stdlib.h>
int rand(void);
rand() 函数能够生成在 0 和 RAND_MAX (在 <tdlib.h> 头文件中定义的符号常量)之间的整数。ANSI 标准指出,RAND_MAX 值的范围至少必须是 32767,在本机系统的定义是 #define RAND_MAX 2147483647 。 如果 rand() 确实能够随机产生一个整数,那么每次调用 rand() 函数时,在 0 和 RAND_MAX 之间的每个数字被选中的几率是相同的。下面的程序模拟色子投掷的情况:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
for(i = 1; i <= 20; i++) {
printf("%10d", 1 + (rand() % 6 ) );
if( i % 5 == 0 )
printf("\n");
}
return 0;
} 运行及输出结果:beyes@linux-beyes:~/C/base> ./rand.exe
2 5 4 2 6
2 5 1 4 2
3 2 3 2 6
5 1 1 5 5 由上可见,每个数字出现的几率大致相同。下面用一个程序模拟 6000 次掷色子的过程并统计出各个面出现的次数:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int face, roll, frequency1 = 0, frequency2 = 0, frequency3 = 0,
frequency4 = 0,frequency5 = 0, frequency6 = 0;
for ( roll = 1; roll <= 60000; roll++ ) {
face = 1 + rand() % 6;
switch( face ) {
case 1:
++frequency1;
break;
case 2:
++frequency2;
break;
case 3:
++frequency3;
break;
case 4:
++frequency4;
break;
case 5:
++frequency5;
break;
case 6:
++frequency6;
break;
}
}
printf("%s%13s\n", "Face", "Frequency");
printf(" 1%13d\n", frequency1);
printf(" 1%13d\n", frequency2);
printf(" 1%13d\n", frequency3);
printf(" 1%13d\n", frequency4);
printf(" 1%13d\n", frequency5);
printf(" 1%13d\n", frequency6);
return 0;
} 运行及输出:beyes@linux-beyes:~/C/base> ./rand-1.exe
Face Frequency
1 10014
1 9912
1 10289
1 10041
1 9875
1 9869 实际上,rand() 函数产生的是伪随机数。重复使用 rand() 函数能够产生一系列数字,这些数字看起来是随机的。但每次执行这个程序时,这些数的顺序都会重复。程序被彻底调式后,每次执行时,这个程序会产生一组不同顺序的随机数。这叫随机化,它是使用标准库函数 srand() 来实现的。函数 srand() 需要一个 unsigned 整型参数,在每次程序执行时使用函数 rand() 去生成一组不同顺序的随机数。 |
|