Windowsバッチ対拍
6794 ワード
アルゴリズム系コンテストのテーマを作るとき、素朴で完全に正しいアルゴリズムを保証できるが、タイムアウトすると考えやすい.効率的なアルゴリズムは、完全に正しいことを保証することはできません.この場合、効率的なアルゴリズムの正確性を検証するために、素朴なアルゴリズム、データ生成プログラム、ファイル比較プログラムを自分で書くことができます.
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間の1つの乱数が0~1の小数であれば、0~10の整数を先に取得し、その後、10をすべて除算して10個の乱数から10個の乱数を得ることができ、ランダムから100%の乱数を得るには、まず0~100の10個の整数を得て、それからすべて100を除算する必要があり、その他の場合はこのように推定する.通常rand()で生成される乱数は、プログラムのデバッグを容易にするために設計されたものであり、実行するたびに前回と同じである.毎回異なる乱数を生成するにはtimeを含めることができる.hヘッダファイルは、srand(unsigned)time(NULL))を使用して現在の時間を使用して乱数発生器をランダム化し、2回の運転ごとに異なる乱数シーケンスが得られることを保証します.
また、プログラムにsrand(unsigned)time(NULL))を1回書くだけで、マルチライトがエラーになります.最初に乱数を生成した後、srand(unsigned)time(NULL)を1回書きました.時間によって種子を埋めたのに相当し、今回埋めた種子は前回の種子と全く同じであるため、発生したシーケンスも同じであり、コンピュータはこのシーケンスの値を順番に最初から取り出し、上記の結果を生じた.
次にrand()が生み出す乱数は最大数万というようです.では、どのようにして数億の大きな乱数を生み出すのでしょうか.
rand()*rand()は間違っていて、このような確率は違います.正確に乱数を大きくする方法はrand 1()<
単純なランダム・データ・ジェネレータ:
1 #include <iostream>
2 #include <cstdio>
3 #include <cstdlib>
4 #include <ctime>
5
6 using namespace std;
7
8 int main()
9 {
10 srand(time(0));
11 int t=0;
12 t=rand()%100;
13 cout<<t<<endl;
14 while(t--)
15 {
16 int n=0;
17 n=10000;
18 cout<<n<<endl;
19 for (int i=1;i<=n;i++)
20 {
21 int a=0,b=0;
22 a=(rand()%10000000)<<8 | (rand()%10000000);
23 b=(rand()%10000000)<<8 | (rand()%10000000);
24 if (a>b)
25 {
26 int temp=b;
27 b=a;
28 a=temp;
29 }
30 cout<<a<<" "<<b<<endl;
31 }
32
33 }
34 return 0;
35 }
バッチ・ビート・プログラム:
1 :loop
2 make.exe > data.txt //make.exe
3 standard.exe < data.txt > std.txt //standard.exe
4 overtaking.exe < data.txt > ans.txt //overtaking.exe
5 fc /A std.txt ans.txt
6 if not errorlevel 1 goto loop
7 pause
8 :end
コマンドラインインタフェースでは、ファイルの違いが見つからないことを絶えず提示し、安心して提出することができます.もちろん、素朴なアルゴリズムが正しいことが前提です.