第92章 random_shuffleアルゴリズム関数を使う


今回は少し変わったアルゴリズム関数を紹介します。



random_shuffle関数です。その名の通り配列の要素をランダムに並び替えます。

template
   void random_shuffle(
      RandomAccessIterator _First, 
      RandomAccessIterator _Last
   );
_Firstには、並び替えの最初の反復子を指定します。
_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関数で作った方が早いのですが・・・)

では、実行結果を見てみましょう。

今回も簡単でしたね。




[C++Index] [総合Index] [Previous Chapter] [Next Chapter]

Update Apr/21/2005 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。