一.随机数生成
我们知道,用rand()可以产生之间的伪随机数,而且在使用rand()之前,我们往往要使用:
srand(time(0));
来初始化随机数种子。
其中 RAND_MAX 往往是short的最大值,为32767(一般在Windows系统下),有些情况下这个数还不够大,所以我们需要将其改为在int范围内的随机数
我们采用宏定义的方法来对rand()进行扩展:
1 #define DEV_RND ((int)rand()*RAND_MAX+rand()) 2 #define RND(L,R) (DEV_RND%((R)-(L)+1)+(L))
其中 DEV_RND 用于返回一个 int 范围内的伪随机数,RND(L,R) 用于返回一个在 范围内的伪随机数
二.简单数据生成
对于很多题目我们直接输出若干个随机数即可制成一组数据,直接用for循环控制即可。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define DEV_RND ((int)rand()*RAND_MAX+rand()) 4 #define RND(L,R) (DEV_RND%((R)-(L)+1)+(L)) 5 int main(){ 6 int T; 7 srand(time(0)); 8 T=RND(1,1000); //数据组数 9 printf("%d\n",T); 10 while(T--){ 11 int a=RND(1,1000000),b=RND(1,1000000); //生成a,b 12 printf("%d %d\n",min(a,b),max(a,b)); 13 } 14 return 0; 15 }
三.数据结构的数据生成器
1):树的生成
模板:
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define DEV_RND ((int)rand()*RAND_MAX+rand()) 4 #define RND(L,R) (DEV_RND%((R)-(L)+1)+(L)) 5 int n;//节点个数 6 pair<int,int>edge[100005]; 7 int main(){ 8 srand(time(0)); 9 scanf("%d",&n); 10 printf("%d\n",n); 11 for(int i=2;i<=n;i++){ 12 int fa=RND(1,i-1); 13 edge[i-1]=make_pair(i,fa); 14 } 15 random_shuffle(edge+1,edge+n);//随机打乱 16 for(int i=1;i<n;i++) 17 printf("%d %d\n",edge[i].first,edge[i].second); 18 return 0; 19 }
2):图的生成
模板(不含重边):
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define DEV_RND ((int)rand()*RAND_MAX+rand()) 4 #define RND(L,R) (DEV_RND%((R)-(L)+1)+(L)) 5 int n,m;//节点个数,边数 6 pair<int,int>edge[100005]; 7 map<pair<int,int>,bool>mp; 8 int main(){ 9 srand(time(0)); 10 scanf("%d%d",&n,&m); 11 printf("%d %d\n",n,m); 12 for(int i=2;i<=n;i++){ 13 int fa=RND(1,i-1); 14 edge[i-1]=make_pair(i,fa); 15 mp[edge[i-1]]=true; 16 } 17 for(int i=n;i<=m;i++) while(true){ 18 int a=RND(1,n),b=RND(1,n); 19 if(a<b) swap(a,b); 20 if(a==b||mp.count(make_pair(a,b))) continue; 21 edge[i]=make_pair(a,b); 22 mp[edge[i]]=true; 23 break; 24 } 25 random_shuffle(edge+1,edge+m+1);//随机打乱 26 for(int i=1;i<=m;i++) 27 printf("%d %d\n",edge[i].first,edge[i].second); 28 return 0; 29 }
注意:
1.输入要满足m>=n-1
2.如果边数超过n*(n-1)/2将会死循环,如果接近n*(n-1)/2运行时间将可能很久