数据生成与对拍

对拍程序

原理

数据生成器:data.exe
暴力解法(标程):brute.exe
待测程序:solve.exe

data生成数据到data.in
solve从data.in读取数据计算输出到data.out
brute从data.in读取数据计算输出到data.ans
最后比对data.ans和data.out 内容是否一致

用system()来调用Windows控制台命令
“<“是从文件读取输入信息
“>”将当前命令输出覆盖重定向
“fc”对比两个文件,相同返回0

代码

#include<bits/stdc++.h>
using namespace std;

int main()
{
  int test=(int)1e3;
  for (int i=1;i<=test;i++) {
    system("data > data.in");
    printf("Test %d:\n",i);

    clock_t st=clock();
    system("solve < data.in > data.out");
    clock_t ed=clock();
    double tim=(double)(ed-st)/CLOCKS_PER_SEC*1000;
    printf("    Time:%.0fms\n",tim);

    system("brute < data.in > data.ans");
    if (system("fc data.ans data.out")) {
      break;
    }
  }
  return 0;
}

数据生成

随机数种子

/*
 *这种方式产生的随机数种子1s才会变一次
 *所以如果数据量比较小的话
 *一次生成多组数据测试比较好
 */
srand((unsigned)time(NULL));

随机数

rand()返回一个[0,RAND_MAX]区间内的整数, RAND_MAX 取决于编译器和操作系统,Windows下通常是0x7fff,Linux下是0x7fff ffff。
大多数时候,我们需要更大的随机数,可以把两个rand()简单乘起来,得到一个范围 [0,RAND_MAX* RAND_MAX ]的随机数生成器,尽管这样不能等概率取到区间内的所有数。

/*
 *生成一个[0,n-1]内的随机数
 *对1e9以内的n都可以很好的工作
 */
int random(int n)
{
  return (long long)rand()*rand()%n;
}

随机树

/*
 *生成一个n个节点的随机树
 *权值范围为[1,1e9]
 *2到n的每个节点向[1,i-1]内的随机一个节点连一条边
 */
for (int i=2;i<=n;i++) {
  int fa=random(i-1)+1;
  int val=random((int)1e9)+1;
  printf("%d %d %d\n",fa,i,val);
}

留下评论