#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的数(其实就是连续的数从11nn,只不过是乱序)。

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. 生成 010-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(); //随机字符