在做演算法類競賽的題目的時候,容易想到乙個樸素的能保證完全正確的演算法,但是會超時。而高效的演算法又不能保證完全寫對。這時候可以自己寫乙個樸素的演算法、乙個資料生成程式和乙個檔案比較程式進行驗證高效演算法的正確性。
在windows下,fc命令提供了比較檔案的功能,雖然批處理不如linux下的bash等強大,但也足以寫個自動比較的程式了。
隨機資料的產生------c++ rand()用法:
rand()不需要引數,它會返回乙個從0到最大隨機數的任意整數,最大隨機數的大小通常是固定的乙個大整數。 這樣,如果你要產生0~10的10個整數,可以表達為:
int n = rand() % 11;
這樣,n的值就是乙個0~10的隨機數,如果要產生1~10,則是這樣:
int n = 1 + rand() % 10;
總結來說,可以表示為:
a + rand() % n
其中的a是起始值,n是整數的範圍。 a + rand() % (b-a+1) 就表示 a~b之間的乙個隨機數若要0~1的小數,則可以先取得0~10的整數,然後均除以10即可得到隨機到十分位的10個隨機小數,若要得到隨機到百分位的隨機小數,則需要先得到0~100的10個整數,然後均除以100,其它情況依此類推。
通常rand()產生的隨機數在每次執行的時候都是與上一次相同的,這是有意這樣設計的,是為了便於程式的除錯。若要產生每次不同的隨機數,可以包含time.h標頭檔案,然後使用srand((unsigned)time(null))來使用當前時間使隨機數發生器隨機化,這樣就可以保證每兩次執行時可以得到不同的隨機數序列。
另外,在程式中只要寫一次srand((unsigned)time(null)),多寫會出錯;第一次產生隨機數後,又寫了一遍srand((unsigned)time(null)); 相當於根據時間又埋下了種子,而這次埋下的種子和上一次的種子是完全相同的,所以產生的序列也相同,於是計算機又按順序從頭開始把這條序列中的值取出來,產生了上述結果;
其次,rand()好像產生的隨機數好像最大也就幾萬。那麼如何產生幾億的大隨機數呢?
rand()*rand()是不對的,這樣的概率是不一樣的。正確的取大隨機數的方法是rand1() << n | rand2()
;即先產生個幾萬的數,把這個數在二進位制下左移,再加上第二次隨機生成的數就可以生成高位隨機數了~~~
乙個簡單的隨機資料生成器:
1 #include 2 #include 3 #include 4 #include 56using
namespace
std;78
intmain()
930 cout<"
"3233}34
return0;
35 }
批處理對拍程式:
1:loop
2make.exe > data.txt //
make.exe是隨機資料生成器程式
3 standard.exe < data.txt > std.txt //
standard.exe標程程式
4 overtaking.exe < data.txt > ans.txt //
overtaking.exe自己的程式
5fc /a std.txt ans.txt
6if not errorlevel 1
goto loop
7 pause
8 :end
命令列介面會不斷提示找不到檔案差異,然後就可以放心提交了,當然前提是你樸素的演算法寫對了。
Windows下批處理對拍程式
echo off again data input 生成隨機輸入 aoutput.a boutput.b fc output.a output.b 比較檔案 ifnot errorlevel 1 goto again 相同時繼續迴圈注 以上部分來自演算法競賽入門經典第二版附錄 再來乙個卿爺的對拍程式...
Windows批處理程式bat
echo off 關閉回顯,否則指令碼中的命令都會輸出,關閉後只顯示結果。setlocal enabledelayedexpansion 在for迴圈中變數擴充套件時需要用到 copy y mstsc.cmd systemroot 將檔案複製到c windows目錄下面 regedit.exe s ...
ubuntu和windows下的程式對拍
對拍是乙個很重要的技巧,無論是在比賽中還是平時的做題中,對拍往往能輕易發現自己的錯誤所在或驗證自己演算法的真實性 首先我們需要兩個程式,乙個確定的暴力程式,還有乙個是你的不確定的 標程 然後我們需要乙個資料生成器,會用rand函式一般就很容易寫出來,用ran.in輸出即可 最後我們需要乙個程式來驗證...