数据生成器

有时我们要验证自己的程序是否正确,需要大量的测试数据,通过生成一些伪随机数来实现这个功能。
[注意]
(1) rand函数的头文件stdlib.h 。rand()生成一个闭区间[0,RAND_MAX] 的均匀随机整数(均匀的含义是:该区间内每个整数被产生的概率相同),其中RAND_MAX至少为32767 (2^15-1,在VS2008中等于此值,#define RAND_MAX 0x7fff),在不同环境下的值可能不同

(2) 严格地说,这里的随机数是“伪随机数”,因为它也是由数学公式计算出来的,不过在算法领域,多数情况下可以把它当作真正地随机数。

(3) 很多人喜欢使用rand()%n产生区间[0,n)内的一个随机整数 。姑且不论这样产生的整数是否仍然均匀分布,当n大于RAND_MAX时,此法并不能得到期望的结果 。如果当n>>RAND_MAX时,要想得到[0,n)内的一个随机整数,可以使用一种“放大”的方法 :先用rand()/RAND_MAX得到[0,1]之间的随机实数,然后再扩大n-1倍之后四舍五入,再加1就可得到[1,n]之间的均匀整数。这样做在n很大时“精度”不好,因为,好比把小图放大后会看到“锯齿”,但当n不是很大的时候,这样做已经可以满足要求了。(如果坚持需要更高的精度,可以采取多次随机的方法

(4) 程序最开始执行了一次srand(time(NULL)) ,其中srand函数用来初始化“随机数种子” 。简单地说,种子是伪随机数计算的依据。种子相同,计算出来的“随机数”序列总是相同的如果不调用srand而直接使用rand(),相当于调用过一次srand(1) ,因此程序每次执行时,将得到同一套随机数。注意,不要在同一个程序每次生成随机数之前都重新调用一次srand,请只在程序开头调用一次srand,而不要在同一个程序中多次调用 。如果需要程序每次执行时使用一个不同的种子,可以用time.h 中的time(NULL) 为参数调用srand,并且只在程序执行的开头调用一次srand。

(5) time函数返回的是自1970年1月1日0点以来经过的“秒数” ,因此每秒才变化一次 。注意,如果你的程序是由操作系统自动批量执行的,可能因为每次运行时间过短,导致在相邻若干次执行时time的返回值全部相同。一个解决办法是,在测试程序的主函数中设置一个循环,做足够多次测试后再退出。

[1] 当n>>RAND_MAX 时,下面的方法将无法得到 我们想要的数据。
#include <cstdio> #include <cstdlib>// srand and rand #include <ctime>// time #define LOCAL int cnt=10, n=1000000; int main() { #ifdef LOCAL freopen("output.txt","a+",stdout); #endif srand(time(NULL));// initialize the random seed int x, y; for (int i=0; i<cnt; ++i) { /* Maximum value that can be returned by the rand function. #define RAND_MAX 0x7fff, that is 2^15-1=32767 */ x=rand()%n;// [0,n) y=rand()%n;// [0,n) printf("%d %d/n",x,y); } return 0; } /* 19397 11604 2435 19212 14883 28664 10907 30209 13009 11404 18248 22011 26911 7724 28428 14852 14145 8269 4437 3685 */

[2] 使用”放大法“ 解决[1]中的问题。

#include <cstdio> #include <cstdlib>// srand and rand #include <ctime>// time #define LOCAL int cnt=10, n=1000000+1; double ZeroToOne()// [0,1] { return (double)rand()/RAND_MAX; } int main() { #ifdef LOCAL freopen("output.txt","a+",stdout); #endif srand(time(NULL));// initialize the random seed int x, y; for (int i=0; i<cnt; ++i) { /* Maximum value that can be returned by the rand function. #define RAND_MAX 0x7fff, that is 2^15-1=32767 */ x=(int)(ZeroToOne()*(n-1)+0.5)+1;// [1,n] y=(int)(ZeroToOne()*(n-1)+0.5)+1;// [1,n] printf("%d %d/n",x,y); } return 0; } /* 19397 11604 2435 19212 14883 28664 10907 30209 13009 11404 18248 22011 26911 7724 28428 14852 14145 8269 4437 3685 812312 596058 447952 243142 423567 828365 343517 405897 506089 511064 577014 643758 627858 688590 269632 329937 958740 482651 662039 424636 */


你可能感兴趣的:(数据生成器)