首页 > 代码库 > 随机数发生器(对拍)-----对比测试
随机数发生器(对拍)-----对比测试
对于写好的程序,可能会花费较长的时间进行调试,所以要具备一定的调试和测试能力。测试的任务就是检查一份代码是否正确。如果找到了错误,最好还能提供一个让它错误的数据。有了错误数据之后,接下来的任务便是调试:找出出错的原因。如果找到了错,最好把它改对——至少对于刚才的错误数据能得到正确的结果。改对一组数据之后,可能还有其他错误,因此需要进一步测试;即使以前曾经正确的数据,也可能因为多次改动之后反而变错了,需要再次调试。总之,在编码结束后,为确保程序的正确性,测试和调试往往要交替进行。
确保代码正确的方法是:再找一份完成同样功能的代码与之对比,用它来和这个新程序“对答案”(俗称对拍)。
下面给出随机数发生器的代码:
#include<stdio.h>#include<time.h>#include<stdlib.h>int n=100,m=100;double random(){ //以下两种方式均可以 //return(double) rand()/RAND_MAX; return (double)rand()/(RAND_MAX+1);}int random(int n){ //return (int)((n-1)*random()+0.5); return (int)(1+n*random());}int main(){ printf("%d%d\n",n,m); srand(time(NULL));//系统时间 for(int i=1;i<=m;i++) { if(rand()%2) printf("A ");else printf("B "); //int x=random(n)+1; int x=random(n); //int y=random(n)+1; int y=random(n); printf("%d %d\n",x,y); } return 0;}
1.rand()函数
rand()函数的主要功能是产生随机数。
(1)表头文件:
#include <stdlib.h>
(2)函数原型:
int rand(void)
(3)函数说明
rand()函数的内部实现是线性同余法的,它不是真的随机数,只不过是因为其周期特别长,所以在一定的范围里可看成是随机的,rand()会返回一随机数,范围在0至RAND_MAX区间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1(即调用srand(1)),rand()产生的是假随机数字,每次执行是相同的,若要不同,以不同的值来初始化它,初始化函数是srand()。
(4)返回值
返回值是0至RAND_MAX之间的随机整数值,RAND_MAX的范围最少是32767之间(int),取双字节(16位数)。若用unsigned int双字节是65535,四字节是4294967295的整数范围,0~RAND_MAX每个数字被选中的机率是相同的。
提示6-1:
stdlib.h中的rand()生成闭区间[0,RAND_MAX]内均匀分布的随机整数,其中RAND_MAX至少为32767。如果生成更大的随机整数,在精度要求不太高的情况下可以用rand()的结果“放大”得到。
说明:用“int x=1+rand()%n;”来生成[1,n]之间的随机数这种方法是不可取的,比较好的做法是:j=1+(int)(n*rand()/(RAND_MAX+1.0));产生一个[1,n]之间的随机数。
2.srand()函数
srand()函数的功能是设置随机数种子。
(1)函数原型:
void srand(unsigned int seed);
(2)函数说明
srand()函数用来设置rand()产生随机数时的随机数种子。参数seed必须是整数,通常可以利用getpid()(即取目前进程的进程识别码)或time(NULL)的返回值来当做seed。
time()函数的功能是返回从1970/01/01到现在的秒数。如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。由于每一次运行程序的时间是不同,time(NULL)
函数的返回值也不同,即种子不同,所以产生的随机数也不同。
提示6-2:
stdlib.h中的srand()函数初始化随机数种子。如果需要程序每次执行是使用一个不同的种子,可以用time.h中的time(NULL)为参数调用srand。一般来说,只在程序执行的开头调用一次srand。