如何造数据-编程学习交流讨论版论坛-综合讨论-ZDZL

如何造数据

此贴参考了造数据-ACGO题库|信息学竞赛OJ刷题平台 帖子

一、准备工作

首先需要三个文件:

  • pi.cpp:标准程序(保证正确的代码)

  • data.cpp:数据生成器(随机生成输入数据)

  • duipai.cpp:批量生成器(批量生成 .in 和 .out 文件)
    还要准备Dev-C++软件

二、三个文件的写法

1. pi.cpp(标程)

#include<bits/stdc++.h> 
using namespace std;
 int main(){
     // 这里放你确定能AC的代码 
    // 注意:代码必须正确,不然造出来的.out文件也是错的 
    return 0; 
}

2. data.cpp(数据生成器)

#include<bits/stdc++.h>
using namespace std;
int main(){
    // 用时间做种子,保证每次运行生成的数据不一样
    srand(time(0));
    // 生成n,范围根据题目来改
    // 如果题目n<=100000,这里就写100000
    int n=rand()%100000+1;
    cout<<n<<"\n";
    // 生成n个数
    for(int i=1;i<=n;i++){
        // 生成1~1e9的随机数
        int x=rand()%1000000000+1;
        cout<<x<<" ";
    }
    cout<<"\n";
    return 0;
}

3. duipai.cpp(批量生成器)

#include<bits/stdc++.h>
#include<windows.h>  // Sleep函数要用
using namespace std;
void solve(int x){
    // 把数字转成字符串,用来当文件名
    string p;
    int now=x;
    while(now){
        p+=char((now%10)+'0');
        now/=10;
    }
    reverse(p.begin(),p.end());
    // 【重要】把路径改成你自己的
    // 如果用户名是zhangsan,就改成zhangsan
    string dir="C:\\Users\\你的用户名\\Desktop\\data\\";
    // 生成.in文件
    string in=dir+p+".in";
    string command1="data.exe > "+in;
    cout<<command1<<"\n";
    system(command1.c_str());
    // 生成.out文件
    string out=dir+p+".out";
    string command2="pi.exe < "+in+" > "+out;
    cout<<command2<<"\n";
    system(command2.c_str());
}
int main(){
    int t;
    cin>>t;  // 输入要生成几组数据
    for(int i=1;i<=t;i++){
        Sleep(50);  // 等50毫秒,防止随机数一样
        solve(i);
    }
    system("pause");
    return 0;
}

三、操作步骤

第1步: 在桌面建一个文件夹,名字叫 data

第2步: 把上面三个.cpp文件放进去

第3步: 编译 pi.cpp,生成 pi.exe

第4步: 编译 data.cpp,生成 data.exe

第5步: 编译 duipai.cpp,生成 duipai.exe

第6步: 双击 duipai.exe,输入数字(比如10),回车

第7步: 打开 data 文件夹,就能看到 1.in1.out2.in2.out……

四、需要改的地方

 
文件 改哪里 改成啥
pi.cpp 整个代码 换成你自己的正确代码
data.cpp rand()%100000+1 题目数据范围
data.cpp 输出内容 题目输入格式
duipai.cpp 你的用户名 你自己的Windows用户名

五、常见问题

1. 双击exe闪退?
在 duipai.cpp 最后一行写了 system("pause") 就不会闪退了

2. 生成的文件是空的?
先检查 data.exe 和 pi.exe 有没有生成,没生成的话重新编译

3. 生成的数据都一样?
把 Sleep(50) 改成 Sleep(200),等久一点

4. 路径找不到?
确认桌面有 data 这个文件夹,确认路径里的用户名是你自己的

5. 随机数不够大?
用 (rand()<<15)|rand() 代替 rand(),比如:int x=((rand()<<15)|rand())%1000000000+1;

制作不易,能评个小小的分再走吗😭?