[C++]for文で配列をシャッフルしてランダムに並び替えるには?

C++

どうも、ちょげ(@chogetarou)です。

for文を使って配列(array)の要素をシャッフルしてランダムに並び替える方法を紹介します。

スポンサーリンク

方法

インターフェース, インターネット, プログラム, ブラウザ, Www

for文を使って配列(array)の要素をシャッフルしてランダムに並び替えるには、フィッシャー–イェーツのシャッフルを使います。

まず、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

コメント

タイトルとURLをコピーしました