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

配列(array)をシャッフルしてランダムに並び替えるには、フィッシャー–イェーツのシャッフルを使います。
まず、配列のインデックスをループします。
ループ処理で、rand()をループ変数に「+1」した値で割った余りで、ランダムなインデックスを生成します。
そして、「生成したランダムなインデックスの要素」と「ループ変数のインデックスの要素」を入れ替えます。
//myArray=対象の配列, T=要素の型
int n = sizeof(myArray) / sizeof(myArray[0]);
for (int i = n-1; i > 0; i--)
{
//ランダムなインデックスを生成
int j = rand() % (i + 1);
//ランダムに入れ替える
T temp = myArray[i];
myArray[i] = myArray[j];
myArray[j] = temp;
}
上記のループは、配列をシャッフルしてランダムに並び替えます。
使用例
#include <stdio.h>
#include <time.h>
int main(void){
int nums[] = { 1, 2, 3, 4, 5 };
int n = sizeof(nums) / sizeof(nums[0]);
//乱数のシード設定
srand ( time(NULL) );
//配列をシャッフル
for (int i = n-1; i > 0; i--)
{
int j = rand() % (i + 1);
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
for (int i = 0; i < n; i++) {
printf("%d ", nums[i]);
}
return 0;
}
出力:
2 5 4 3 1
コメント