今回は少し変わったアルゴリズム関数を紹介します。
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