#1127. caryon-数据生成方法
caryon-数据生成方法
当前没有测试数据。
markdown https://github.com/luosiwei-cmd/CarYon/wiki
制作输入输出文件
下面的操作都是要包含头文件 caryon.h,注意,在程序的目录文件夹也可以包含头文件经过编译后产生的 caryon.h.gch 文件,来使用数据生成器。一定需要使用命名空间 ca。CarYon 几乎所有的变量,函数,类都在命名空间 ca 中指定。
制造 in 文件
打开 test.cpp,看向这个程序段:
makein(1,10){
csh();
xxxxx;
}
这个操作是用来生成文件:1.in-10.in的,可以自由更改makein的两个参数进行替换。例如makein(3,5)就是生成3.in-5.in。
填写 xxx 中的内容为 inint(3);
当我们执行完test.cpp后就会发现根目录多出来了一个文件夹,里面有1.in~10.in的文件,这些文件都包含 3,这就是制造的结果。
如果您想要了解 inint 函数的具体使用,请查看下一个标题。
这里需要注意,csh() 函数不可删去,否则会出现一些未知问题。
下面这个:
dataname="";
这个是填写产生数据的前缀的,例如下面的程序:
#include"caryon.h"
using namespace std;
using namespace ca;
int main(){
dataname="chen_zhe-ak-ioi";
makein(1,10){
csh();
xxx;
}
}
就会在根目录里面的文件夹data-chen_zhe-ak-ioi中生成chen_zhe-ak-ioi1.in~chen_zhe-ak-ioi10.in了。
注意,dataname字段内不可以出现空格!!!
在我们的所有东西搞完后,记得使用
closefile();
函数来释放内存空间。(效果类似于fclose,可以不写)
程序中 xxx; 就是对于每一个输入文件需要执行的操作。下面的一个标题就是关于这个的。
写入 in 文件
必须有东西写入每一个in文件才能制作对应的out文件。除非您的std.exe没有输入。
下面介绍五个函数能满足此功能。
inint(int);
instring(std::string);
template<class T>in<T>(T);
inint是将一个整型的变量或常量写入每一个输入文件。如果想要随机的,请参阅下一个 Wiki。
instring 是将一个 C++ 字符串写入每一个输入文件,例如空格和换行:
instring(" ");
instring("\n"):
ingraph() 可以将一个图写入输入文件,图的创建和随机构造参见图和树 Graph and tree,例如:
graph<int> a;
a=rand_graph(n,m,min,max,cyrand);
ingraph(a);
in() 可以直接将任何类型写进输入文件(CarYon 中已经定义的图除外),仅需类型重载了流插入和流提取运算符<<,>>。
例如:
long long int a;
in<long long int>(a);
就是把超长整型a写入输入文件。
注意,这里如果 typename 为空格或换行等流提取运算符无法读入的东西,请使用 instring 函数或者下面的两个函数。
inendl() 可以在输入文件中打印一个换行符。
inspace() 可以在输入文件中打印一个空格。
制作 out 文件
我们已经学会去制造in文件了,怎么创造对应的out文件呢?我们把之前的样例丰富一下:
#include"caryon.h"
using namespace std;
using namespace ca;
int main(){
dataname="chen_zhe-ak-ioi";
makein(1,10){
csh();
xxx;
}
makeout(1,10);
}
此时,在test.cpp所在的目录里面必须有std.exe文件,也就是俗称的标准程序。注意一定是标准程序经过编译后的 std.exe文件,才能制造出对应的out文件。在 std.cpp 中不需要包含任何文件操作。
其他随机函数
CarYon 可以生成其他一些随机的东西,例如:
cyrand_formatc(); //随机转义字符
cyrand_word(a);//长度为a的随机词汇(单词),全部是小写字母,返回的字符串类型
cyrand_article(a); //有a个词汇的随机段落
生成一个随机小写单词
生成长度为 a 的单词,全部是小写字母。
string s = cyrand_word(a);//a为长度
instring(s);//写入文件
//将a改成随机数,即可随机长度
生成一个随机大写单词
生成长度为 a 的单词,全部是大写字母。
string s = cyrand_word_A(a);//a为长度
instring(s);//写入文件
//将a改成随机数,即可随机长度
若想要生成一排列(1~n)并且不重复,那么请用
RandomP(int* arr,int size);
函数,其作用是在 arr 数组里面生成一不重复的1~n的数。
生成 n 个 不重复的 1- n之间的数字,随机排列
若想要生成一个数列、并且不重复,那么请用
RandomP(int* arr,int size);
函数,其作用是在 arr 数组里面生成不重复的1 ~ n的数(其实就是连续的数从到 ,只不过是乱序)。
arr是数组名,最小的数字是1,最大的数字是size, 也是数组的大小。
例如:
若想要生成一个 1 - 10的数列,并且不重复,那么10个数就是1到10;
const int N = 10;
int a[N];//定义数组
RandomP(a, N);
//使用循环输出数组
for(int i = 0; i < N; i++){
cout << a[i] <<" ";
}
生成随机数列的功能。
inline void randomArr(int* arr,int n,int lower,int upper,int flag);
arr 是数组,生成的数列将被存放在这里,n是数组的最大长度,lower是数组中元素的最小值,upper是最大值。
flag=0 时无限制,flag=1 升序,flag=2降序,flag=-1不重复。
有了这些函数,您可以造出一些有趣的数据,祝您使用愉快!
生成从小到大的随机数
定义一个长度为100的数组,最大下标为99, 最小值1,最大值1000,升序排列
注意,当要生成不重复的数列的时候,lower和upper的值要设置的间距大一点,不然会有重复的。
int a[100];
//randomArr(int* arr,int n,int lower,int upper,int flag);
randomArr(a,99,1,1000,1);
一、生成一个整数
1. 生成一个 int 类型的整数
int a = cyrand(1,10);//生成一个1-10之间的整数赋值给变量a
括号内参数是区间的起始大小,闭区间;
2. 生成一个 long long类型的整数
long long a = cyrand_ll(1e8,1e18);
括号内是区间,闭区间;
二、double 类型数据的生成
1. 生成 之间的随机小数
doubleRandom()函数可以返回 0 -1 之间的小数,但是很怪,每次不管生成多少个,生成的都一样。
所以,一般是生成一个整数,然后乘以生成的小数,但是注意位数不能大于double类型的有效数字位数。
2. 生成固定位数的小数 double
先生成随机整数,然后再输出的时候乘以小数
例如:想要1.0-99.9之间的两位小数
int n = cyrand(100,9990);//生成100-9990之间的整数
in<double>(n*0.01); //写入double类型的数据 括号内为写入的数据
或者
int n = cyrand(100,9990);//生成100-9990之间的整数
in<double>(1.0 * n / 100); //写入double类型的数据 括号内为写入的数据
3. 生成随机位数的小数 double
因为没有相应的函数,我采取的办法是使用一个数组存放10的倍数,然后随机一个整数作为数组下标,然后用另一个随机的整数除以数组的元素得到不同位数的小数。
int f[] = {1,10,100,1000,10000,1e5,1e6,1e7,1e8};
int a = cyrand(0,8);//随机数作为数组下标,达到随机选择数组元素的目的
int b = cyrand(0, 100000);//随机整数
double c = (double)b / (double)(f[a]);
in<double>(c);
三、生成布尔类型随机数
cyrand_bool(); //随机布尔类型的值
四、生成随机的单个字母
1. 生成单个小写字母
cyrand_engs(); //随机英文小写字母
2. 生成单个大写字母
cyrand_engb(); //随机英文大写字母
3.随机一个可见字符(ASCII码32到126)
cyrand_letter(); //随机字符