配列の中身を並べ替え(シャッフル)したいことってあると思います。その方法を書き残します。
配列をシャッフルしよう
配列の中身をシャッフルしたいと思います。
以下動画は音無しです。これから紹介するコードの動作を確認いただけます。
例えばじゃんけん
はじめから配列の中身が多いと少しわかりづらいと思うのでじゃんけんを例にし3つの配列要素をシャッフルしたいと思います。
サンプルコード
//配列を作成
String[] str = {“グー”, “チョキ”, “パー”};
//配列の中身を並べ替え(シャッフル)
for (int i = str.length – 1; i > 0; i–) {
int r = (int) (Math.random() * (i + 1));
String tmp = str[i];
str[i] = str[r];
str[r] = tmp;
}
System.out.print(str[0]); // “グー”, “チョキ”, “パー”から1つ表示される
簡単な解説
配列を作成してからfor文で配列の中身を入れ替えています。
詳しく見ていくとMath.random()を使って乱数を作成しています。Math.random()は、0以上1未満の浮動小数点数を返す関数ですが*(i + 1)をして、この場合だと0〜3未満の数値を返すようにしています。そしてint型へキャストすることによって小数点以下を切り捨てて0 1 2 のいずれかの整数が変数 r へ代入されます。そしてstr[i]の要素とstr[r]の要素が入れ替わります、次に0 1 のいずれかが変数 rへ代入されまたstr[i]の要素とstr[r]の要素が入れ替わります。これを続けていきシャッフルさせています。
整数の並べ替え
サンプルコード
int[] number = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//配列の中身を並べ替え(シャッフル)
for (int i = number.length – 1; i > 0; i–) {
int r = (int) (Math.random() * (i + 1));
int tmp = number[i];
number[i] = number[r];
number[r] = tmp;
}
簡単な説明
わかりづらいと思いますので、拡張for文を間に入れてあげると動きを理解しやすいと思います。
■ number[r] = tmp; の下に以下コードを入れると配列の中身の入れ替わっていく様を確認できます。
// 配列の中身入れ替わり動作確認
for(int check : num) {
System.out.print(check);
}
System.out.println();
おわり
配列の中身を乱数を使って入れ替えることは初心者としてはなかなか仕組みを理解するのに時間がかかりました。
できることが広がった気がして少し嬉しいです。