数据点生成器——头文件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;
}