跳转至

随机数据生成与对拍

mt19937

std::mt19937是伪随机数产生器,用于产生高性能的随机数。 C++11引入。 返回值为 unsigned int。

std::mt19937接收一个unsigned int数作为种子。所以可以如下定义:

std::mt19937 mt_rand(std::random_device{}());
std::mt19937 mt_rand(time(0));
std::mt19937 mt_rand(std::chrono::system_clock::now().time_since_epoch().count());

其中mt_rand是自定义函数名,可以随便写。

time()

函数:time(time_t * timer)

1.当参数为NULL时(大多数情况下),返回值是从1970年1月1日至今所经历的时间(以秒为单位)

system()

函数名: system

  • 功 能: 发出一个DOS命令

  • 用 法: system(char *command);

system("std.exe < data.in > data.out");含义为将data.in 作为输入文件运行std.exe,输出文件转储到data.out,代码里面不用写freopen()

system("./std < data.in > data.ans");是Linux的写法。

strcat()

将两个char类型字符串连接起来。 char d[20]="GoldenGlobal"; char *s="View"; strcat(d,s); 结果放在d中 printf("%s",d); 输出 d 为 GoldenGlobalView (中间无空格) d和s所指内存区域不可以重叠且d必须有足够的空间来容纳s的字符串。

对拍(Code from xzx)

以a+b为例

  1. make.cpp
#include <bits/stdc++.h>
using namespace std;
int main(){
    mt19937 rnd(time(0));
    printf("%d %d\n", rnd() % 10000, rnd() % 10000);
    return 0;
}
  1. std.cpp (正解/暴力)
#include <bits/stdc++.h>
using namespace std;
int main(){
    int a, b;
    scanf("%d%d", &a, &b);
    printf("%d\n", a + b);
    return 0;
}
  1. 被对拍程序

写做code.cpp

  1. 对拍程序

duipai.cpp

#include <bits/stdc++.h>
using namespace std;
int main(){
    int t = 0;
    while(true){
      /*   linux //windows   */
        printf("test #%d: ", ++t);
        system("./make > data.in"); //system("make.exe > data.in");
        system("./std < data.in > data.ans"); //system("std.exe < data.in > data.ans");
        system("./code < data.in > data.out"); //system("code.exe < data.in > data.out");
        if(system("diff data.out data.ans > data.log")){
            //system("fc data.out data.ans > data.log");
            printf("WA\n");
            break;
        }else{
            printf("AC\n");
        }
    }
    return 0;
}./ ->.\\

对拍