random_shuffle関数です。その名の通り配列の要素をランダムに並び替えます。
template_Firstには、並び替えの最初の反復子を指定します。void random_shuffle( RandomAccessIterator _First, RandomAccessIterator _Last );
さて、この関数を用いてランダムに並び替えを行っても必ず同じパターンで並び替えが起ります。
たとえば、1,2,3,4という配列を並び替えると1,4,3,2となったとします。
すると、違う機会に同様の配列を並び替えるとやはり、1,4,3,2となってしまいます。
これでは、ゲームなどに使えませんね。
それで、この関数の改良版がありますが、まだプレリミナリーです。
使い方は、サンプルを見た方が早いですね。
// shuffle.cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { vector<int> v; int i; for (i = 0; i < 10; i++) v.push_back(i); cout << "元の配列" << endl; for(i = 0; i < 10; i++) cout << v[i] << endl; random_shuffle(v.begin(), v.end()); cout << endl; cout << "シャッフル後" << endl; for (i = 0; i < 10; i++) cout << v[i] << endl; return 0; }シャッフル後は、確かにバラバラな並びになっていますが、このプログラムを何回実行しても、シャッフル後の並びは同じです。
では、この関数を利用して簡単な数当てゲームを作ってみましょう。
// kazuate.cpp #include <iostream> #include <vector> #include <algorithm> #include <stdlib.h> #include <time.h> using namespace std; int main() { vector<int> v; int i, n, x; for (i = 0; i < 100; i++) v.push_back(i); srand((unsigned)time(NULL)); n = rand() % 10; for (i = 0; i < n; i++) random_shuffle(v.begin(), v.end()); while (1) { cout << "数を入力(0-99)---"; cin >> x; if (x < v[0]) { cout << "小さすぎます" << endl; } else if (x > v[0]) { cout << "大きすぎます" << endl; } else { cout << "正解です" << endl; break; } } return 0; }random_shuffle関数を1回実行しただけでは正解が決まってしまうので、複数回(0-9回)のいずれかを実行します。これは、Cランタイムのrand関数で行っています。 (それなら、正解もrand関数で作った方が早いのですが・・・)
では、実行結果を見てみましょう。
今回も簡単でしたね。
Update Apr/21/2005 By Y.Kumei