首页 > 代码库 > 随机数发生器(对拍)-----对比测试

随机数发生器(对拍)-----对比测试

对于写好的程序,可能会花费较长的时间进行调试,所以要具备一定的调试和测试能力。测试的任务就是检查一份代码是否正确。如果找到了错误,最好还能提供一个让它错误的数据。有了错误数据之后,接下来的任务便是调试:找出出错的原因。如果找到了错,最好把它改对——至少对于刚才的错误数据能得到正确的结果。改对一组数据之后,可能还有其他错误,因此需要进一步测试;即使以前曾经正确的数据,也可能因为多次改动之后反而变错了,需要再次调试。总之,在编码结束后,为确保程序的正确性,测试和调试往往要交替进行。

确保代码正确的方法是:再找一份完成同样功能的代码与之对比,用它来和这个新程序“对答案”(俗称对拍)。

下面给出随机数发生器的代码:

 

#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。