对拍

10 分钟

对拍是自动找错的利器。准备三样东西:① 一个笨但保证正确的暴力程序(std);② 你要测的优化程序(sol);③ 一个随机数据生成器(gen)。让生成器不停造小规模随机输入,两个程序跑同一份输入、比对输出,一旦不一致就抓到了一个能复现的错误样例。

# 对拍脚本(Linux/mac;Windows 用 bat 类似)
while true; do
    ./gen > in.txt            # 造一组随机数据
    ./sol < in.txt > o1.txt   # 待测程序
    ./std < in.txt > o2.txt   # 暴力正确程序
    if ! diff o1.txt o2.txt > /dev/null; then
        echo "找到不同!"; break   # 此时 in.txt 就是错误样例
    fi
done

好处:错误样例是自动生成并保存下来的,可以拿去单步调试,比干瞪代码高效得多。要点:暴力必须确信是对的(哪怕慢),否则两个都错、越拍越糊涂;数据规模要(下一节讲原因)。对拍主要抓逻辑错和边界错,抓不出两份代码"错得一模一样"的情况。

小纸条

对拍需要准备哪三样?

登录 后可看答案

对拍 · 考级冲刺 · op599 课程