2016.01.31

配列の並び替え(シャッフル)

はじめに

配列に格納されている数値をランダムに並び替えるプログラムを紹介します。

ここで紹介する並び替えは、配列乱数を使って作成しています。Java標準で用意されているCollections.shuffleは使っていません。

Javaソースコード

以下が並び替えのソースコード例で、1~10の数を並び替えています。乱数を使っているので実行の結果は毎回違います。

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;

int型を10個格納できる配列を用意し、その配列に1~10の値を格納しています。

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=0rnd=6のときの配列の値の変化を表しています。ary[0]とary[6]の値が入れ替わります。

020
021
022
		// 結果を表示
		for ( int i = 0; i < ary.length; ++ i )
			System.out.println( ary[ i ] );

並び替った配列aryの値を表示しています。

以上です。

関連コンテンツ

同じ型の変数(データ)を複数個まとめて管理するデータの持ちかたがあります。これが配列です。くわしくは、記事をご覧ください。

2016.01.14

トランプ(カード)を扱うクラスを紹介しています。

2019.08.05

自動で神経衰弱を行うJavaのソースコードを紹介しています。興味のある方は、ご覧ください。

2021.03.31

処理を繰り返すために使用するfor文について解説しています。

2020.03.23

乱数の意味と、Math.randomメソッドの使い方をソースコードを使って詳しく解説しています。

2015.12.27

2つの変数の値を入れ替える方法を紹介しています。

2016.01.29

ソート(並び替え)アルゴリズムの1つであるクイックソートについて詳しく解説しています。Javaのソースコード付きです。

2019.09.06

プログラミング、ITに関する用語をまとめています。

2022.10.17

画像フォーマット形式・色・大きさ・傾きなどの変更、特定の図形(文字・記号など)を見つけたり、取り出したりする画像処理について詳しく解説。

2015.11.29

変数やクラスに格納されている値をコンソール出力する方法は?

2020.03.23

プログラムの最初に実行されるメソッドは?

2022.12.13

プログラミングで使う変数って何?

2020.03.23

Javaのプログラムを書いてみませんか?プログラムの書き方をくわしく説明しています。

2020.03.23

「Javaソースコード」から実行可能な「オブジェクトコード」に変換する方法をくわしく説明しています。

2020.03.23

プログラミング言語とは?種類や特徴について説明しています。

2022.08.03

Javaプログラムの構成について解説しています。詳しくは、こちらをご覧ください。

2020.03.23

「ゆるゆるプログラム」のコンテンツを紹介しています。興味のある方はこの記事をご覧ください。

2020.03.23

Javaの学習に役立つソースコードを多数紹介しています。是非、ご覧ください。

2022.09.10

Javaを使った簡単な応用プログラム(生年月日から年齢を計算プログラムなど)を紹介しています。

2022.07.07

Swingパッケージを使ってグラフィック表示を行う方法を解説しています。

2020.03.23

三角形、台形、円などいろいろな図形の面積を計算するプログラムを紹介しています。詳しくは、記事をご覧ください。

2021.05.18

配列を使うJavaソースコードを多数紹介しています。

2021.05.18

繰り返し処理を使ったJavaのソースコードサンプルを紹介しています。

2020.03.23

数学に関係するJavaのメソッドやソースコードなどを紹介しています。

2022.10.25

StringクラスとStringBuilderクラスを利用したプログラミングの仕方を紹介しています。

2016.12.16

日本で使われてきた伝統文様「和柄」について解説しています。

2022.07.27

広告