学习

Windows下对拍

Wider · 1月27日 · 2020年 · · 7454次已读

What is 对拍

Tool:

  • 你的程序
  • 可以输出正解的暴力程序
  • 数据生成器
  • 输出对比器
  • RP

用来干什么?

  • 用来造数据,检验你的程序的正确性,以方便修改和出现未考虑到的情况

如何工作?

  1. 数据生成器生成一组数据(据题意输出) test.in
  2. 你的程序输入test.in 运行输出结果
  3. 暴力程序输入test.in 运行输出结果
  4. 输出对比器比较两个程序的输出
  5. 如果输出不一致就停止
  6. 手动检查错误
  7. (被动)RP--

你的程序:

依照题目做题(前提是你能做出来 :smirk:)

暴力程序:

直接打暴力,不用太多优化 :blush: :blush:

数据生成器:

根据题目输入要求生成数据(不用多说吧?)
好吧,有些重点还是要讲一讲:
随机数据!!!

函数名: rand
功 能: 随机数发生器
用 法: int rand(void);
所在头文件: stdlib.h cstdlib
函数说明 :
rand()的内部实现是用线性同余法做的,它不是真的随机数,因其周期特别长,故在一定的范围里可看成是随机的。
rand()返回一随机数值的范围在0至RAND_MAX 间。RAND_MAX的范围最少是在32767之间(int)。用unsigned int 双字节是65535,四字节是4294967295的整数范围。0~RAND_MAX每个数字被选中的机率是相同的。
用户未设定随机数种子时,系统默认的随机数种子为1。
rand()产生的是伪随机数字,每次执行时是相同的;若要不同,用函数srand()初始化它。

函数名: srand
功 能: 初始化随机数发生器
用 法: void srand(unsigned int seed);
所在头文件: stdlib.h cstdlib
函数说明:
srand()用来设置rand()产生随机数时的随机数种子。
参数seed必须是个整数,通常可以利用time(0)的返回值或NULL来当做seed。
如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。

rand()和srand()要一起使用,其中srand()用来初始化随机数种子,rand()用来产生随机数。
因为默认情况下随机数种子为1,而相同的随机数种子产生的随机数是一样的,失去了随机性的意义,所以为使每次得到的随机数不一样,用函数srand()初始化随机数种子。srand()的参数,用time函数值(即当前时间),因为两次调用rand()函数的时间通常是不同的,这样就可以保证随机性了

#include<cstdlib>
#include<ctime>
//获取系统时间需调用time库
#include<iostream>
using namespace std;
int main()
{
    srand(time(0));//time(0)获取系统时间
    cout<<rand();
    return 0;
}

数据对比器:

个人喜好用bat写
diff.bat:

@echo off
:again
    random.exe
    my.exe
    std.exe
    fc my.out std.out
    if not errorlevel 1 goto again
    pause
  • random.exe:数据生成器
  • my.exe:你的程序
  • std.exe:暴力程序
  • fc:cmd下用来比较文件是否相同
  • if not errorlevel 1:就是如果文件不相同(不必深究)
运行后目录应该是这个样子:

对拍成功应该是这个样子:

如果出错会出现如下画面:

1 条回应
  1. Wider2020-2-8 · 17:16