测试数据生成

测试数据生成

前置知识:

\(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\)

posted @ 2023-10-20 21:07  wyl123ly  阅读(55)  评论(0)    收藏  举报