STL でシャッフルする

カードゲームなどで、シャッフルする部分を STL を使ってプログラムしてみます。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. ゲームプログラムでは、乱数を使ってシャッフルすることが良くあります。
    STL(Standard Template Library) にはシャッフルを行うアルゴリズムが備わっていて、これを使えば一発です。
    前問に続いて STL を使っていますが、これを機会に習得して下さい。
  2. 新規プロジェクトから、空の Console Application を作成して、次のファイルをプロジェクトに加えて下さい。
        /*★ 乱数を使ってシャッフルする     前田  稔 ★*/
        #include <stdio.h>
        #include <vector>
        #include <algorithm>
        using namespace std;
    
        int main()
        {   vector<int> v;
            int         i;
    
            for(i=0; i<10; i++)         v.push_back(i);
            random_shuffle(v.begin(), v.end());
            for(i=0; i<v.size(); i++)   printf("%d\n",v[i]);
            return 0;
        }
        
  3. vector を使うので vector をインクルードして下さい。
    andom_shuffle() 関数を使うので algorithm をインクルードして下さい。
    vector にも algorithm にも「.h」が付けられていないことに注目して下さい。
    これが新しい仕様のヘッダファイルです。 <(`^´)>
    using namespace で std で宣言されたネームを使えるようにします。
    STL で定義されている標準的な名前は、スコープが std:: として宣言されています。
        #include <stdio.h>
        #include <vector>
        #include <algorithm>
        using namespace std;
        
  4. 0~9の値を vector に格納して、random_shuffle() でシャッフルします。
    random_shuffle() の引数には「並び替えの最初の反復子」と「並び替えの最後の反復子」を指定します。
    シャッフルが終わった vector を printf() で表示しています。
            for(i=0; i<10; i++)         v.push_back(i);
            random_shuffle(v.begin(), v.end());
            for(i=0; i<v.size(); i++)   printf("%d\n",v[i]);
        
  5. このままではシャッフルした結果が何時も同じ順序になります。
    これではゲームに使えませんね。
    そこで現在時刻を使って乱数の初期化を行います。
    これでプログラムを作成した本人にも予測できないシャッフルを行うことができます。
        #include <time.h>
    
        time_t  nowtime;
        time(&nowtime);
        srand((int)nowtime);
        

【演習】

乱数を初期化してプログラムを完成させて下さい。
毎回シャッフルの順序が変わることを確認して下さい。

【NOTE】

vector では配列と同じように添え字が使えますが、他のコンテナでは添え字に代えてイテレータ(Iterator)を使います。
イテレータ(反復子)とは、コンテナのセル(要素)をポイントするもので、実際にはポインタが使われているようです。
イテレータを使って vector を印字するときは、次のようになります。
v.end() は「最後の要素+1」をポイントしています。
イテレータ(ポインタ)には、大小関係が無いので注意して下さい。
for(vector::iterator it=v.begin(); it!=v.end(); ++it)
    printf("%d\n",*it);

超初心者のプログラム入門(C/C++)