正确的对拍方式
更新日志
upd 2022/2/16. 修改一处事实错误,轻微修改格式 .
前言
看到 Keven_He 在大力传播错误的对拍方式,我觉得应该写一下怎么正确对拍了 .
概论
对拍大概就是俩程序然后不断随机数据比较俩程序输出 .
其中一个程序是保证对的,例如贺的题解或打的暴力
相当于全自动 Hack 机
随机数据
关于随机我觉得 Mivik 大佬写得还是非常好的:https://mivik.blog.luogu.org/the-art-of-randomness 建议直接看他的
随机数
基本要求是随机数吧 .
如何生成随机数?
一个典型的错误范例(by Keven_He 大师):
int random(int n){
return rand()*rand()%n+1;
}
首先 rand()
函数是用线性同余法实现的,我们可以搞到它的源代码
stat long next = 1;
/* RAND_MAX assumed to be 32767 */
int myrand(void) {
next = next * 1103515245 + 12345;
return((unsigned)(next/65536) % 32768);
}
void mysrand(unsigned seed) {
next = seed;
}
不难发现循环节为 .
在 Windows 系统下,rand()
函数能生成的最大值(RAND_MAX
)与 Linux 下有明显差异(Windows 下范围较小)
然而 rand()
生成的随机数的质量 OI Wiki 上也给出了说明:
- C/C++ 标准未规定质量 .
- GCC 编译器对
rand()
所采用的实现方式周期短 - 假设
rand()
是均匀随机,它取模后也不一定均匀
建议使用 std::mt19937
(unsigned long long
版 std::mt19937_64
),使用梅森旋转算法,周期长质量高速度快(需要 <random>
头文件,since C++11) .
用法自己百度 .
前面说了取模是不均匀的,所以生成区间里的随机数建议用 uniform_int_distribution
(正态分布,since C++11)
然后俩随机数乘起来是 非常不均匀的,不要用 .
关于随机种子:显然种子决定生成了啥随机数,所以我们每次拍都要用一个不同的种子,这样才能保证数据质量 .
一种常见的思路是引用时间
使用 time(0)
是最坏的选择 —— 因为它返回的是以秒为单位的时间,所以一秒内生成的数据会一模一样
我不知道 random_device
可不可以,没试过,也没啥用,因为调用太多会寄 .
优的方法可以用 std::chrono
(since C++11,需要 <chrono>
),可以百度一下 .
你可以向生成器的 argv
里丢一个种子进去,外层随便随机 .
然后内层用 sscanf
读出来设成种子,我写过这种对拍,感觉很不优美啊 .
随机打乱
shuffle
.
随机树
Prufer 序列 .
注意不要随机父亲,是不均匀的 .
强推 随机的艺术
Mivik 大佬写得太好啦!
https://mivik.blog.luogu.org/the-art-of-randomness 建议直接看他的 .
里面说了随机图,随机括号序列啥的 .
运行
编译好程序,然后跑即可 .
你可以把编译也写到对拍程序里 .
不建议用批处理(bat).
一个技巧:绕过文件输入输出
(Windows)
prog.exe < in.txt > out.txt
这样就可以不用文件输入输出啦!
比较
比较,Windows 下是 fc
,Linux 下是 diff
.
可以通过改一些选项来实现特定功能
示例代码
// Windows
#include <windows.h>
using namespace std;
int main()
{
while (true)
{
system("mker.exe > i.in");
system("C.exe < i.in > o1.out");
system("brute.exe < i.in > o2.out");
system("fc o1.out o2.out");
}
return 0;
}
是不是非常简单!
东方 Project(AD)
快来打东方绀珠传 .
完美无缺模式可以无限复活!(虽然 biu 了就直接存档点了,i wanna 模式)
东方绀珠传好玩!
没了 .
Reference
ref 每篇都比我写得好 .
读 ref 比读我这个好 .
以下是博客签名,正文无关
本文来自博客园,作者:yspm,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/15895224.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】