ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

竞赛试题数据生成器制作

2020-12-01 08:02:28  阅读:309  来源: 互联网

标签:rand 竞赛 试题 int 生成器 DEV RND 随机数 define


一.随机数生成

  我们知道,用rand()可以产生[0,RAND\_MAX]之间的伪随机数,而且在使用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) 用于返回一个在 [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运行时间将可能很久

标签:rand,竞赛,试题,int,生成器,DEV,RND,随机数,define
来源: https://www.cnblogs.com/la-oj/p/14066045.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有