正確的對拍方式

2022-09-21 12:09:10 字數 1997 閱讀 9381

看到 keven_he 在大力傳播錯誤的對拍方式,我覺得應該寫一下怎麼正確對拍了 .

目錄執行

比較示例**

東方 project(ad)

reference

對拍大概就是倆程式然後不斷隨機資料比較倆程式輸出 .

其中乙個程式是保證對的,例如賀的題解或打的暴力

相當於全自動 hack 機

關於隨機我覺得 mivik 大佬寫得還是非常好的: 建議直接看他的

基本要求是隨機數吧 .

如何生成隨機數?

乙個典型的錯誤範例(by keven_he 大師):

int random(int n)
首先rand()函式是用線性同餘法實現的,我們可以搞到它的源**

static unsigned long next = 1;

/* rand_max assumed to be 32767 */

int myrand(void)

void mysrand(unsigned seed)

不難發現迴圈節為 \(32767\) .

在 windows 系統下,rand()函式能生成的最大值(rand_max)與 linux 下有明顯差異(windows 下範圍較小)

然而rand()生成的隨機數的質量 oi wiki 上也給出了說明:

建議使用std::mt19937unsigned long longstd::mt19937_64),使用梅森旋轉演算法,周期長質量高速度快(需要標頭檔案,since c++11) .

前面說了取模是不均勻的,所以生成區間裡的隨機數建議用uniform_int_distribution(正態分佈,since c++11)

然後倆隨機數乘起來是非常不均勻的,不要用 .

關於隨機種子:顯然種子決定生成了啥隨機數,所以我們每次拍都要用乙個不同的種子,這樣才能保證資料質量 .

一種常見的思路是引用時間

使用time(0)是最壞的選擇 —— 因為它返回的是以秒為單位的時間,所以一秒內生成的資料會一模一樣

我不知道random_device可不可以,沒試過,也沒啥用,因為呼叫太多會寄 .

shuffle.

prufer 序列 .

注意不要隨機父親,是不均勻的 .

mivik 大佬寫得太好啦!

建議直接看他的 .

裡面說了隨機圖,隨機括號序列啥的 .

編譯好程式,然後跑即可 .

你可以把編譯也寫到對拍程式裡 .

不建議用批處理(bat).

乙個技巧:繞過檔案輸入輸出

(windows)

prog.exe < in.txt > out.txt

這樣就可以不用檔案輸入輸出啦!

比較,windows 下是fc,linux 下是diff.

可以通過改一些選項來實現特定功能

// windows

#include using namespace std;

int main()

return 0;

}

是不是非常簡單!

快來打東方紺珠傳 .

完美無缺模式可以無限復活!(雖然 biu 了就直接存檔點了,i wanna 模式)

東方紺珠傳好玩!

沒了 .

ref 每篇都比我寫得好 .

讀 ref 比讀我這個好 .

關於隨機數的前世今生 - muxii

隨機函式 - oi wiki

【**】**隨機分布及c++當中的實現 - 囧仙

對拍程式的寫法

每次對拍都是查這裡。一來二去就會寫了。由於對windows系統並不了解 linux就更不了解了 所以口胡可能有紕漏歡迎指正。首先新建乙個資料夾 對拍 這個資料夾叫什麼放在哪都無關緊要 在這個資料夾下放入製造資料的程式data.exe,你的程式test.exe,標程std.exe。其它檔案在這個資料夾...

對拍方法 pascal

這次noip看到旁邊用c 那位對拍得好爽,自己也搜了一下對拍的方法,可惜多不適合pascal黨,所以我中和幾種方法,終於弄出了乙個用 命令提示符對拍的方法。首先要有乙個 百分百對的程式 我寫了個排序 a.pas varn,e longint a array 0.1000 of longint pro...

對拍程式寫法

一口毒奶 bat的寫法 echo off loop rand.exe in txt mycode.exe in txt myout.txt baoli.exe in txt baoliout.txt fc myout.txt baoliout.txt if not errorlevel 1 goto...