2016.01.31
配列の並び替え(シャッフル)
はじめに
Javaソースコード
Shuffle.java
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024
public class Shuffle { public static void main( String[] args ) { // 配列を定義 int[] ary = new int[ 10 ]; // 配列に1からの連番を格納 for ( int i = 0; i < ary.length; ++ i ) ary[ i ] = i + 1; // シャフル for ( int i = 0; i < ary.length; ++ i ) { // 0~(配列aryの個数-1)の乱数を発生 int rnd = (int)( Math.random() * (double)ary.length ); // ary[ i ]とary[ rnd ]を入れ替える int w = ary[ i ]; ary[ i ] = ary[ rnd ]; ary[ rnd ] = w; } // 結果を表示 for ( int i = 0; i < ary.length; ++ i ) System.out.println( ary[ i ] ); } }
コンパイル ソースコードが「ANSI」の場合
C:\talavax\javasample>javac -encoding sjis Shuffle.java
コンパイル ソースコードが「UTF-8」の場合
C:\talavax\javasample>javac Shuffle.java
実行
C:\talavax\javasample>java Shuffle
出力結果(1回目)
8 6 10 7 3 1 4 9 5 2
出力結果(2回目)
6 7 9 5 10 2 1 3 4 8
Javaソースコードの解説
ここからは、このソースコードを上から順番に解説していきます。
001
public class Shuffle {
クラス名を、Shuffleとしています。
002
public static void main( String[] args ) {
このmainメソッドからプログラムを実行します。
003 004 005 006 007
// 配列を定義 int[] ary = new int[ 10 ]; // 配列に1からの連番を格納 for ( int i = 0; i < ary.length; ++ i ) ary[ i ] = i + 1;
009 010 011 012 013 014 015 016 017 018
// シャフル for ( int i = 0; i < ary.length; ++ i ) { // 0~(配列aryの個数-1)の乱数を発生 int rnd = (int)( Math.random() * (double)ary.length ); // ary[ i ]とary[ rnd ]を入れ替える int w = ary[ i ]; ary[ i ] = ary[ rnd ]; ary[ rnd ] = w; }
ary[ i ]と乱数で発生したrndの配列ary[ rnd ]の値を入れ替えます。全配列の値を乱数で発生した配列番号の値と入れ替えることで、まんべんなくシャフルされます。以下の図は、i=0、rnd=6のときの配列の値の変化を表しています。ary[0]とary[6]の値が入れ替わります。
020 021 022
// 結果を表示 for ( int i = 0; i < ary.length; ++ i ) System.out.println( ary[ i ] );
並び替った配列aryの値を表示しています。
以上です。