正确的对拍方式

更新日志

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;
}

不难发现循环节为 \(32767\) .

在 Windows 系统下,rand() 函数能生成的最大值(RAND_MAX)与 Linux 下有明显差异(Windows 下范围较小)

然而 rand() 生成的随机数的质量 OI Wiki 上也给出了说明:

  • C/C++ 标准未规定质量 .
  • GCC 编译器对 rand() 所采用的实现方式周期短
  • 假设 rand() 是均匀随机,它取模后也不一定均匀

建议使用 std::mt19937unsigned long longstd::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 比读我这个好 .

posted @ 2022-02-15 10:06  Jijidawang  阅读(161)  评论(4编辑  收藏  举报
😅​