どうも、ちょげ(@chogetarou)です。
配列(array)をシャッフルしてランダムに並び替える方法を紹介します。
方法

配列(array)をシャッフルしてランダムに並び替える方法は、3つあります。
for文
1つ目は、for文を使う方法です。
まず、for文で配列のインデックスを逆順でループします。
ループ処理で、rand()を「ループ変数に1を足した値」で割った余りを取得します。
次に、swap()を呼び出します。
そして、swap()の第1引数に「配列のループ変数のインデックスの要素」、第2引数に「配列の取得した余りのインデックスの要素」を指定します。
//myArray=対象の配列
int length = size(myArray); //配列の要素数を取得
for (int i = length - 1; i >= 0; --i) {
int j = rand() % (i + 1); //ランダムなインデックスを取得
swap(myArray[i], myArray[j]); //要素を入れ替える
}
上記のfor文は、配列(array)の要素をシャッフルしてランダムに並び替えます。
使用例
#include <iostream>
#include <ctime>
using namespace std;
int main(void){
string nums[5] = { "one", "two", "three", "four", "five"};
srand(time(NULL));
int length = size(nums);
for (int i = length - 1; i >= 0; --i) {
int j = rand() % (i + 1);
swap(nums[i], nums[j]);
}
for(string item: nums) {
cout << item << endl;
}
return 0;
}
出力:
three
one
two
five
four
random_shuffle()
2つ目は、ranadom_shuffle()を使う方法です。
まず、algorithmをインクルードします。
#include <algorithm>
次に、random_shuffle()を呼び出します。
そして、random_shuffle()の第1引数に配列のイテレータの先頭、第2引数に配列のイテレータの末尾を指定します。
//myArray=対象の配列
random_shuffle(std::begin(myArray), std::end(myArray));
上記のrandom_shuffle()は、配列(array)の要素をシャッフルしてランダムに並び替えます。
使用例
#include <iostream>
#include <algorithm>
#include <ctime>
using namespace std;
int main(void){
string nums[5] = { "one", "two", "three", "four", "five"};
random_shuffle(begin(nums), end(nums));
for(string item: nums) {
cout << item << endl;
}
return 0;
}
出力:
five
four
two
three
one
shuffle()
3つ目は、shuffle()を使う方法です。
まず、randomをインクルードします。
#include <random>
次に、shuffle()を呼び出します。
shuffle()の第1引数に配列のイテレータの先頭、第2引数に配列のイテレータの末尾を指定します。
そして、shuffle()の第3引数にstd::default_random_engine()を指定します。
//myArray=対象の配列
shuffle(std::begin(myArray), std::end(myArray), std::default_random_engine());
上記のshuffle()は、配列(array)の要素をシャッフルしてランダムに並び替えます。
使用例
#include <iostream>
#include <random>
#include <ctime>
using namespace std;
int main(void){
string nums[5] = { "one", "two", "three", "four", "five"};
//std::default_random_engine()の引数にシードを設定
shuffle(begin(nums), end(nums), default_random_engine(time(NULL)));
for(string item: nums) {
cout << item << endl;
}
return 0;
}
出力:
one
three
five
two
four
まとめ
配列(array)をシャッフルしてランダムに並び替える方法は、次の3つです。
- for文を使う方法
- random_shuffle()を使う方法
random_shuffle(std::begin(myArray), std::end(myArray));
- shuffle()を使う方法
shuffle(std::begin(myArray), std::end(myArray), std::default_random_engine());
コメント