测试数据生成
测试数据生成
前置知识:
\(freopen()\)
freopen("filename.Extension_name", "mod", stdin/out);
- 含义:
文件重定向。
freopen("test.in", "r", stdin);
将所有在 \(test.in\) 中读到的数据作为标准输入流输入程序。
freopen("test.out", "w", stdout);
将所有程序中标准输出流输出的数据写到 \(test.out\) 中。
注意事项:
- 数据生成程序和题目程序放在一个文件夹目录下。
- 格式规范:\(freopen(\cdots)\)
例子:
洛谷 P1551 亲戚
在我们写完程序后,通过考场上给的小样例可以一定程度上检验你的程序的正确性,但却无法保证能过所有的测试数据。
所以我们就要自己生成大样例,进一步检验程序的正确性。
\(P1551\) 正确代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int MAXN = 5005;
int n,m,q;
int f[MAXN];
int query(int x){
if(f[x] == x){
return x;
}else{
return f[x] = query(f[x]);
}
}
void to(int x,int y){
f[query(y)] = query(x);
}
int main(){
freopen("test.in", "r", stdin);
freopen("test.out", "w", stdout);
scanf("%d%d%d", &n, &m, &q);
for(int i = 1;i <= n;i++){
f[i] = i;
}
for(int i = 1;i <= m;i++){
int x,y;
scanf("%d%d", &x, &y);
to(x,y);
}
for(int i = 1;i <= q;i++){
int x,y;
scanf("%d%d", &x, &y);
if(query(x) == query(y)){
printf("Yes\n");
}else{
printf("No\n");
}
}
return 0;
}
依据题意的数据生成代码:
#include<iostream>
#include<cstdio>
#include<random>
#include<cmath>
#include<algorithm>
#include<ctime>
#include<cstdlib>
using namespace std;
int randm(int l,int r){
srand(time(NULL));
int c = r - l;
int modd = rand() % (c + 1);
return modd + l;
}
int main(){
freopen("test.in", "w", stdout);
int n = randm(3000,5000);
int m = randm(10000,20000);
int p = randm(10000,12000);
printf("%d %d %d\n", n, m, p);
for(int i = 1;i <= m;i++){
int min = 0,max = 100;
random_device seed;//硬件生成随机数种子
ranlux48 engine(seed());//利用种子生成随机数引擎
uniform_int_distribution<> distrib(min, max);//设置随机数范围,并为均匀分布
int x = (distrib(engine) *distrib(engine) *distrib(engine)) % n;//随机数
int y = (distrib(engine) *distrib(engine) * distrib(engine)) % n;
printf("%d %d\n", x, y);
}
for(int i = 1;i <= p;i++){
int min = 2,max = 1000;
random_device seed;//硬件生成随机数种子
ranlux48 engine(seed());//利用种子生成随机数引擎
uniform_int_distribution<> distrib(min, max);//设置随机数范围,并为均匀分布
int x = (distrib(engine) *distrib(engine) *distrib(engine)) % n;//随机数
int y = (distrib(engine) *distrib(engine) * distrib(engine)) % n;
printf("%d %d\n", x, y);
}
return 0;
}
解释:
测试数据生成程序中在 \(test.in\) 中输出,而题目程序用 \(test.in\) 作为标准输入。
这样便可以省去中间数据转移的过程了
\(END\)
本文来自博客园,作者:wyl123ly,转载请注明原文链接:https://www.cnblogs.com/wyl123ly/p/make_data.html