Loading...

测试数据生成利器——testdata.h

check评论:0 条 remove_red_eye浏览量:493 change_historyTags:编程学习笔记
作者 : deco date_range日期 : 2018-08-16

该头文件由alpha1022编写,本人仅为使用文档书写者。

使用文档

$\color{red}{\text{testdata.h}}$

是一个专门用于数据制造的头文件,
这里是它的使用方法和部分使用技巧

$gcd$

原型:$unsigned \ int \ gcd(unsigned \ int \ a,unsigned \ int \ b)$

即输入两个非负整数,返回他们的最大公约数

该函数使用$stein$算法完成,您也可使用$C++$自带的$\_\_gcd$函数

$lcm$

原型:$unsigned \ int \ lcm(unsigned \ int \ a,unsigned \ int \ b)$

即输入两个非负整数,返回他们的最小公倍数

$do\_not\_reset\_seed$

原型:$inline\ void\ do\_not\_reset\_seed()$

调用此函数之后,您可以自己使用$srand()$设置种子

$choose$

原型:$template<class\ \_Pointer>$

$ \_Pointer\ choose(\_Pointer\ \_beg,\_Pointer\ \_end)$

在指针$beg$和$end$之间返回随机指针

$xrand$

$xrand$是加强版$rand$,你可以通过使用他来获取更加强大的随机数,现已经支持$long\ long$

$randint$

我们支持三种$randint$,您可以通过输入两个$double$类型的数作为上下界,也可以输入两个$int$以内的数作为上下界,还可以输入您自己定义的结构体的类型

$double$型的主要应用是方便于科学记数法,即$1e5$之类的表示

关于结构体的$randint$,您可以定义结构体比如$struct \ edge$,然后给定两个$edge$类型的数来进行$randint$

$randstr$

原型:$inline\ string\ randstr(size\_t\ len,const \ string \&\ charset)$

您可以通过这个函数,输出一个长为$len$的随机字符串,$charset$是你指定的所有可选的字符集合

我们给定了几个您可使用的常量,请在本指南的末尾附录内查看

$randstr\_prefix$

原型:$inline \ string \ randstr\_prefix(size\_t \ len,const \ string \&\ charset, const \ string \&prefix)$

前面的两个量与$randstr$中是相同的,$prefix$代表您的指定前缀,该函数会生成由您指定前缀的$randstr$随机字符串

注意:$len$代表随机部分的长度,不包含前缀的长度

$randstr\_suffix$

原型:$inline\ string\ randstr\_suffix(size\_t\ len,const \ string \&\ charset,const string \&\ suffix)$

与$rand\_prefix$不同的是,该函数生成的是指定后缀的随机字符串

注意:$len$代表随机部分的长度,不包含后缀的长度

以下关于图的函数,当您生成该图时,系统会将边存入结构体$edge$中,您需要先声明$graph$类的一个变量,再引用函数。您可以使用$print()$函数直接将点数,边数,以及连接情况输出到数据文件中,详细的图输出介绍请参考后文

$generate\_tree$

该函数提供两种随机生成树的方式,第一种为只带入生成树的点数,第二种则包含了权值上界和下界

原型:

  • 只带入点数$void \ generate\_tree(int \ n)$
  • 有权值上下界$void\ generate\_tree(int\ n,int\ lower,int\ upper)$

$generate\_dag$

该函数也提供两种随机生成$dag$图的方式,两种都需要给定$dag$图的点数和边数,和树一样,第二种您也需要输入权值上下界

原型:

  • 只带入点数,边数$void\ generate\_dag(int\ n,int\ m)$
  • 有权值上下界$void\ generate\_dag(int\ n,int\ m,int\ lower,int\ upper)$

注意:当边数小于点数时,程序将不会运行

$generate\_graph$

如前两个函数,该函数仍提供两种生成随机图的方式,两种都需要给定随机图的点数和边数,和树一样,第二种您也需要输入权值上下界

原型:

  • 只带入点数,边数$void\ generate\_graph(int\ n,int\ m)$
  • 有权值上下界$void\ generate\_graph(int\ n,int\ m,int\ lower,int\ upper)$

$generate\_link$

该函数也是提供两种生成链的方式,第一种为只带入链的点数,第二种则包含了权值上界和下界

原型:

  • 只带入点数$void \ generate\_link(int \ n)$
  • 有权值上下界$void\ generate\_link(int\ n,int\ lower,int\ upper)$

$generate\_mum$

该函数提供两种方法以生成特殊的$n-1$叉树,具体的使用方法与树一样,不同的是该函数生成出来的树会有$n-1$个叶子节点,即所有叶子节点都是根的直系儿子

原型:

  • 只带入点数$void \ generate\_mum(int \ n)$
  • 有权值上下界$void\ generate\_mum(int\ n,int\ lower,int\ upper)$

关于输出图

调用$print()$函数,您可以输出图的点数,边数,以及每行一条连接的边

当您不希望输出点数,边数时,您可以使用函数$print\_edges()$从而只输出所有边

您也可以调用$count\_vertices()$来返回点数以及$count\_edges()$来返回边数

关于数据生成

您可以循环生成数据文件,使用方法如下

for(int i=1;i<=10;i++)
{
    testdata td("qwq",i);
    /*
    do something
    */
    td.generate("std.exe");
}

qwq可换成您想要的文件前缀名,它会生成十个文件,分别是qwq1.in,qwq2.in......

然后在注释的区域中,根据您需要生成的数据,利用上面的函数来编写代码

输出数据(不包括$print()$函数)您需要使用我们的
$td$函数以代替$cout$,您并不需要$freopen$或$fopen$来打卡或关闭文件,以下是一个输出$1-1000$以内的一个随机数的例子

td<<randint(1,1000)<<"\n";//不能使用endl

最后,您需要调用$td.generate()$函数来生成与$in$文件对应的$out$文件,括号内填写您标程生成的$exe$文件的名字即可,最文章的末尾会给出一个数据生成的$demo$

附录:一些已经定义了的常量

  • $ALPHABET\_SMALL$小写字母集合
  • $ALPHABET\_CAPITAL$大写字母集合
  • $ALPHABET$大小写字母集合
  • $NUMBERS$数字集合
  • $PI(3.141592653589793)$
  • $E(2.718281828459045)$

$demo$

生成A+B problem以及最短路的数据,标程生成的文件均为qwq.exe

$A+B\ problem$

#include <testdata.h>
using namespace std;
int main()
{
    for(int i=1;i<=10;i++)//十组数据
    {
        testdata td("data",i);
        td<<randint(1,10000)<<" "<<randint(1e0,1e5)<<"\n";
        td.generate("qwq.exe");
    }
}

最短路

#include <testdata.h>
using namespace std;
int main()
{
    for(int i=1;i<=10;i++)
    {
        testdata td("data",i);
        int n=randint(1000,10000);
        int m=randint(n,100000);
        graph a;
        a.generate_graph(n,m,1,randint(10000,100000));
        print();
        generate("qwq.exe");
    }
}

testdata.h

暂无评论

正在回复给  
去登陆?

   点击刷新验证码

标签云

文章留名