随机数据生成与对拍¶
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()¶
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为例
- 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;
}
- 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;
}
- 被对拍程序
写做code.cpp
- 对拍程序
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;
}./ ->.\\