测试程序,测试数据必不可少,要获得尽可能多的测试数据,随机函数的使用必不可少。
本文是研究《算法竞赛入门经典(第二版)》习题4-1 象棋 Uva1589过程的产物。
rand(),srand()研究
上网搜索了许多,不理想,感觉难以理解。
按自己的想法,编程验证吧。
程序1:
#include <stdio.h>
#include <stdlib.h>
int main(){
int i;
for(i=0;i<10;i++){
printf("%d %d\t",rand(),rand());
}
printf("\n\n");
for(i=0;i<10;i++){
printf("%d %d\t",rand(),rand());
}
return 0;
}
程序1运行结果,运行了两次
第一次:
第二次:
对比两次输出结果,完全相同,想要说明的问题是,rand()每次运行时,默认初始化值始终相同,即每次srand()的调用参数,完全同相同。
程序2:
#include <stdio.h>#include <stdlib.h>
int main(){
int i;
srand(1);
for(i=0;i<10;i++){
printf("%d %d\t",rand(),rand());
}
printf("\n\n");
for(i=0;i<10;i++){
printf("%d %d\t",rand(),rand());
}
return 0;
}
程序2的输出结果与程序1完全一致,对比两个程序,可以发现,rand()默认采用srand(1)初始化。
程序3:
#include <stdio.h>
#include <time.h>
int main(){
printf("%d %d\n",time(0),time(NULL));
return 0;
}
程序3输出
time(0)与time(NULL)结果完全一致,故0与NULL完全等价,
在stddef.h中发现#define NULL 0。
time是C语言获取当前系统时间的函数,以秒作单位,time(0)代表自Unix标准
时间戳(1970年1月1日0点0分0秒,GMT)到当前时间经过了多少秒。程序运行,
每次time(0)值均不同。
程序4:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(){
int i;
srand(time(0));
for(i=0;i<10;i++){
printf("%d %d\t",rand(),rand());
}
printf("\n\n");
for(i=0;i<10;i++){
printf("%d %d\t",rand(),rand());
}
return 0;
}
程序4,因time(0)每次运行值都不同,每次srand(time(0))对rand()的初始化值都不同,故每次运行程序,产生的随机数都不同。
本文目的,是弄清srand(time(0));rand();这对组合的原理。