本文介绍随机数据的生成方法与对拍测试方法。读者将学习使用 C++ 随机数产生器,根据题目要求构造各种规模的输入数据,用于对自己编写的程序进行检测。同时,读者也将学习编写简单的脚本,自动化、批量化运行 "数据生成程序" 和两份不同的 "问题求解程序",并对两份程序的输出结果进行对比:我们把这种过程称为 "对拍"。
随机数据生成与对拍可用于以下场景:
1.在无法获得实时评测反馈的比赛中,思考并实现了一个 "高分解法",但实在不会证明自己的结论,或者不能确保自己编写的程序是否完全正确。
这种情况下,建议读者酌情分配一些时间,额外编写一份随机数据生成程序、一份把朴素算法求解的程序 (通常朴素解法时间复杂度高,但实现简单,不易出错)。然后把 "高分解法" 与 "朴素解法" 进行对拍,看二者的输出结果是否始终保持一致。
2.在平时解题时,自己编写的程序无法在 OJ 上取得 Accept 结果,调试很久仍未发现错误,并且不能下载到题目的测试数据,或者虽然能下载到测试数据,但发生错误的数据规模过大,不容易进行调试。
这时可以编写一个随机数据生成程序,再编写一个使用朴素算法的程序 (或者直接在网络上搜索其他人的 AC程序),与自己的 "错误解法" 对拍。我们可以适当调整随机数据的规模,控制在易于人工演算和调试的范围内。虽然数据较小,出错概率极低,但是 "对拍" 脚本能够批量化执行,在成千上万次测试中,一般总能找到一个造成错误的小规模数据。
3.有一个不错的构思,自己出了一道题目。
此时当然需要生成一些测试数据,并且需要用 "对拍" 来检测自己写的 "标准程序" 的正确性。不过,除了随机数据外,通常还需要增加一些特殊构造的数据,保证测试数据的全面性。
随机数据生成
头文件 cstdlib (stdlib.h) 包含 rand 和 srand 两个函数,以及 RAND_MAX 常量。
RAND_MAX 是一个不小于 32767 的整数常量,它的值与操作系统环境、编译器环境有关。一般来说,在Windows系统中为32767,在类Unix系统中为2147483647。
rand()函数:返回一个