数据点生成器——头文件data_gen.h(v1.0.4版)

做了一个快捷的数据点生成器

很水,但是方便

v1.0.5计划支持测试点直接移至下一个

欢迎改编或续编!

/*
数据点生成器
v1.0.4
by 123asdf123(洛谷576074)
*/
#include<bits/stdc++.h>
using namespace std;
#define CRT_SECURE_NO_WARNINGS
//fix 随机数一样 
random_device R;
mt19937 G(R());
class data{
	public:
		//add in v1.0.0
		//构造生成器,同时输入指向的文件名 
		data(string name){
			s=name;
		}
		//打开文件 
		void open(string in_or_out){
			string tmp=s+"."+in_or_out;
			freopen(tmp.c_str(),"wb",stdout);
		}
		//返回控制台 
		void close(){
			freopen("CON","wb",stdout);
		}
		//直接输出值 
		template<class T>void output(T v){
			cout<<v;
		}
		//返回随机整数(int/unsigned/short/unsigned short/long/unsigned long/long long/unsigned long long)
		template<class T>T random_int(T l,T r){
			return uniform_int_distribution<T>(l,r)(G);
		}
		//返回随机浮点数(float/double/long double) 
		template<class T>T random_double(T l,T r){
			return uniform_real_distribution<T>(l,r)(G);
		}
		//返回随机布尔值(可设定概率) 
		bool random_bool(double true_get_time=0.5){
			return bernoulli_distribution(true_get_time)(G);
		}
		//输出一个数组 
		template<class T>void output_array(T v[],int l,int r){
			for(int i=l;i<=r;i++)
				cout<<v[i];
		}
		//add in v1.0.1
		//假·endl
		void endl(){
			printf("\n");
		}
		//真·endl
		void endll(){
			cout<<std::endl;
		}
		//输出数组,两个值之间由一个值间隔 
		template<class T,class V>void output_array_between(T v[],int l,int r,V k){
			for(int i=l;i<r;i++)
				cout<<v[i]<<k;
			cout<<v[r];
		}
		//输出数组,两个值之间由一个数组的一段值循环间隔 
		template<class T,class V>void output_array_between_array(T v[],int l,int r,V k[],int between_start,int between_end){
			for(int i=l;i<r;i++)
				cout<<v[i]<<k[(i-l)%(between_end-between_start+1)+between_start];
			cout<<v[r];
		}
		//add in v1.0.2
		//直接输出一个随机整数(int/unsigned/short/unsigned short/long/unsigned long/long long/unsigned long long)
		template<class T>void output_random_int(T l,T r){
			cout<<uniform_int_distribution<T>(l,r)(G);
		}
		//直接输出一个随机浮点数(float/double/long double) 
		template<class T>void output_random_double(T l,T r){
			cout<<uniform_real_distribution<T>(l,r)(G);
		}
		//直接输出一个随机布尔值(可设定概率) 
		void output_random_bool(double true_get_time=0.5){
			cout<<bernoulli_distribution(true_get_time)(G);
		}
		//add in v1.0.3
		//构造函数可以同时输测试点编号了 
		data(string name,int testcase){
			s=name+to_string(testcase);
		}
		//空格 
		void space(){
			printf(" ");
		}
		//add in v1.0.4
		//连续输出同一个值 
		template<class T>void output(T v,int times){
			while(times--)
				cout<<v;
		}
		//连续输出同一个值,中间间隔一个值 
		template<class T,class V>void output(T v,int times,V between){
			times--;
			cout<<v;
			while(times--)
				cout<<between<<v;
		}
		//将整数数组[l,r]一段赋值为随机值 
		template<class T>void random_int_array(T v[],int l,int r,int min,int max){
			for(int i=l;i<=r;i++)
				v[i]=random_int(min,max);
		}
		//将浮点数数组[l,r]一段赋值为随机值 
		template<class T>void random_double_array(T v[],int l,int r,int min,int max){
			for(int i=l;i<=r;i++)
				v[i]=random_double(min,max);
		}
		//将布尔数组[l,r]一段赋值为随机值 
		void random_bool_array(bool v[],int l,int r,int true_get_time=0.5){
			for(int i=l;i<=r;i++)
				v[i]=random_bool(true_get_time);
		}
		//交换式对数组区间[l,r]随机排序 
		template<class T>void random_sort(T v[],int l,int r,int iteration=100000){
			while(iteration--)
				swap(v[random_int(l,r)],v[random_int(l,r)]);
		}
		//插入式对数组区间[l,r]随机排序 
		template<class T>void random_sort_insert(T v[],int l,int r){
			for(int i=l;i<r;i++)
				swap(v[i],v[random_int(i+1,r)]);
		}
	private:
		//add in v1.0.0
		string s;
};

用法示例:

a+b problem,100个测试点

#include "data_gen.h"
int main(){
	for(int i=1;i<=100;i++){
		data x("a_plus_b",i);
		x.open("in");
		long long a=x.random_int(-2147483648LL,2147483647LL),b=x.random_int(-2147483648LL,2147483647LL);
		x.output(a);
		x.space();
		x.output(b);
		x.open("out");
		x.output(a+b);
	}
	return 0;
}
posted @ 2023-03-26 00:31  123asdf123  阅读(17)  评论(0编辑  收藏  举报  来源