看到 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::mt19937
(unsigned long long
版std::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...