源自:《C Primer Plus》第五版p335
在这个随机函数使用了一个具有内部链接的静态变量。ANSI C程序库提供了rand()函数来产生随机数。有多种产生随机数的算法,ANSI C标准允许C实现使用针对特定机器的最佳算法,不过,ANSI C也提供了一个可移植的标准算法,可以在不同系统中产生随机数。事实上,rand()是一个”伪随机数发生器“,这意味着可以预测数字的实际顺序(计算机不具有自发性),但这些数字在可能的取值范围内均匀分布。
s_and_r.cpp程序
/*s_and_r -- 包含函数rand1()和srand1()*/ /* 使用ANSI C的可移植算法 */ static unsigned long int next = 1; //种子 int rand1(void) { //产生伪随机数的魔术般的公式 next = next * 1103515245 + 12345; return (unsigned int) (next/65535) % 32768; } void srand1(unsigned int seed) { next = seed; }
r_drive1.cpp程序
//r_drive1.cpp --测试函数rand1()和srand1()函数 /*与s_and_r.cpp一起编译 */ #include<stdio.h> //#include<time.h> extern void srand1(unsigned int x); //声明外部函数 extern int rand1(void); int main(void) { int count; unsigned int seed; printf("enter seed:\n"); while(scanf("%d",&seed) == 1) { srand1(seed); //设置种子 for(count =0; count < 5;count++) printf("%d\n",rand1()); //输入随机数 printf("next feed(q to quit):\n"); } /*srand1((unsigned int) time(0)); //以系统时间作为种子,每次得到的随机数不一样 printf("%d\n",rand1());*/ return 0; }
运行结果:
enter seed:
1
16838
5759
10114
17516
31052
next feed(q to quit):
45
4060
2673
15646
11658
30980
next feed(q to quit):
q
请按任意键继续. . .
说明:rand1()函数可得到一个在0到32767范围内的随机数;
可以用系统时间来作为种子,则r_drive.cpp可写成如下:
//r_drive1.cpp --测试函数rand1()和srand1()函数 /*与s_and_r.cpp一起编译 */ #include<stdio.h> #include<time.h> //包含time()函数 extern void srand1(unsigned int x); //声明外部函数 extern int rand1(void); int main(void) { srand1((unsigned int) time(0)); //以系统时间作为种子,每次得到的随机数不一样 printf("%d\n",rand1()); return 0; }每次运行都会得到以系统时间为种子的随机数。