乱数の範囲とシャッフル
範囲指定した乱数とコレクションのシャッフルです。
「乱数の範囲とシャッフル」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。
範囲とシャッフル
実際のプログラムで、0からbound-1までの値だけが必要になることはほとんどありません。このレッスンでは、任意の範囲、コレクションのランダムなシャッフル、ランダムな要素の選択について説明します。
カスタム範囲の公式
minからmaxまでを含むintを生成するには、min + rng.nextInt(max - min + 1)を使います。
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random rng = new Random();
int min = 10, max = 20;
int value = min + rng.nextInt(max - min + 1);
System.out.println("10 to 20: " + value);
}
}originとboundを指定したnextInt
最近のJavaでは、nextInt(origin, bound)を直接呼び出せます。originは含まれ、boundは含まれません。これにより、手動で公式を書く必要がなくなります。
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random rng = new Random();
int value = rng.nextInt(10, 21);
System.out.println("10 to 20: " + value);
}
}範囲内のランダムなdouble
loからhiまでのdoubleを生成するには、lo + rng.nextDouble() * (hi - lo)を使います。
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random rng = new Random();
double lo = 5.0, hi = 7.5;
double value = lo + rng.nextDouble() * (hi - lo);
System.out.println(value);
}
}リストをシャッフルする
Collections.shuffle(list)は、Listをその場でランダムに並べ替えます。カードデッキやランダム形式のクイズに適しています。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> deck = new ArrayList<>(List.of(1, 2, 3, 4, 5));
Collections.shuffle(deck);
System.out.println(deck);
}
}再現可能なシャッフル
シードを設定したRandomを第2引数に渡すと、決定的なシャッフルを行えます。例:Collections.shuffle(list, new Random(seed))。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class Main {
public static void main(String[] args) {
List<Integer> deck = new ArrayList<>(List.of(1, 2, 3, 4, 5));
Collections.shuffle(deck, new Random(99));
System.out.println(deck);
}
}シャッフルには変更可能なリストが必要
List.of(...)は不変リストを作成します。これをシャッフルするとUnsupportedOperationExceptionがスローされます。先にnew ArrayList<>(...)でラップしてください。
ランダムな要素を選ぶ
ランダムなインデックスを生成し、getを使うことでランダムな要素を選択できます。
import java.util.List;
import java.util.Random;
public class Main {
public static void main(String[] args) {
List<String> colors = List.of("red", "green", "blue");
Random rng = new Random();
String pick = colors.get(rng.nextInt(colors.size()));
System.out.println("Chosen: " + pick);
}
}配列をシャッフルする
配列には組み込みのシャッフル機能がありません。一般的な方法はFisher-Yatesアルゴリズムです。各要素を、それ以前または同じ位置にあるランダムなインデックスの要素と交換します。
import java.util.Arrays;
import java.util.Random;
public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
Random rng = new Random(3);
for (int i = arr.length - 1; i > 0; i--) {
int j = rng.nextInt(i + 1);
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
System.out.println(Arrays.toString(arr));
}
}ランダムサンプリング
重複しない複数の要素を取り出すには、コピーをシャッフルして先頭から必要な数だけ取得するか、Setで選択済みのインデックスを追跡します。小さなリストでは、シャッフルしてから範囲を切り出す方法が最も簡単です。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> pool = new ArrayList<>(List.of(1, 2, 3, 4, 5, 6, 7, 8));
Collections.shuffle(pool);
List<Integer> sample = pool.subList(0, 3);
System.out.println("Sample: " + sample);
}
}実用上の注意
完全にランダムな並べ替えが必要な場合はシャッフルを使い、範囲内の値が必要な場合はカスタム範囲の公式を使います。上限を含める場合は、必ずオフバイワンに注意してください。
理解度チェック
範囲とシャッフルについての理解度を確認しましょう。
まとめ
範囲の指定とシャッフルを学びました。
- 範囲を指定するには、
min + nextInt(max - min + 1)またはnextInt(origin, bound)を使います。 Collections.shuffleは変更可能なリストをその場で並べ替えます。- 再現性が必要な場合は、シャッフルにシードを設定します。
- ランダムなインデックスを使ってランダムな要素を選択します。
よくある質問
「乱数の範囲とシャッフル」レッスンは無料ですか?
はい。「乱数の範囲とシャッフル」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。
「乱数の範囲とシャッフル」で何を学びますか?
範囲指定した乱数とコレクションのシャッフルです。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「乱数の範囲とシャッフル」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Math クラス
- 乱数の生成
- 乱数の範囲とシャッフル
- Math の丸めと上限・下限