乱数の生成
Random と ThreadLocalRandom です。
「乱数の生成」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。
乱数を生成する
乱数はゲーム、シミュレーション、サンプリングで利用されます。JavaにはMath.random()、Randomクラス、並行処理向けのThreadLocalRandomがあります。
Math.randomの基本
Math.random()は[0.0, 1.0)の範囲のdoubleを返します。0.0は含み、1.0は含みません。
public class Main {
public static void main(String[] args) {
double r = Math.random();
System.out.println("Value between 0 and 1: " + r);
}
}Math.randomの範囲を調整する
乗算してキャストすると、整数の範囲を得られます。(int)(Math.random() * 6)は0から5までの値を生成します。
public class Main {
public static void main(String[] args) {
int roll = (int)(Math.random() * 6) + 1;
System.out.println("Dice: " + roll);
}
}Randomクラス
java.util.Randomクラスは、より柔軟に使えます。インスタンスを作成してから、nextInt、nextDouble、nextBooleanなどのメソッドを呼び出します。
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random rng = new Random();
System.out.println(rng.nextBoolean());
System.out.println(rng.nextDouble());
}
}上限を指定したnextInt
nextInt(bound)は、0以上bound未満のintを返します。nextInt(6)では0から5までの値が得られます。
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random rng = new Random();
int value = rng.nextInt(100);
System.out.println("0 to 99: " + value);
}
}再現性のためのシード
コンストラクターにseedを渡すと、生成される系列が決定的になります。同じシードからは常に同じ数値が生成されます。これはテストで非常に役立ちます。
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random rng = new Random(42);
System.out.println(rng.nextInt(1000));
System.out.println(rng.nextInt(1000));
}
}同じシードなら同じ系列
同じシードで作成した2つのRandomオブジェクトは、同一の系列を生成します。バグを正確に再現する必要がある場合に便利です。
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random a = new Random(7);
Random b = new Random(7);
System.out.println(a.nextInt(50) == b.nextInt(50));
}
}ThreadLocalRandom
マルチスレッドプログラムでは、1つのRandomを共有するとボトルネックになります。ThreadLocalRandom.current()を使うと、各スレッドが競合なしで専用の生成器を持てます。
import java.util.concurrent.ThreadLocalRandom;
public class Main {
public static void main(String[] args) {
int value = ThreadLocalRandom.current().nextInt(1, 7);
System.out.println("Dice: " + value);
}
}スレッド間で1つのRandomを共有しない
1つのRandomインスタンスを多数のスレッドに渡さないでください。分布の質が低下したり、競合が発生したりする可能性があります。並行処理ではThreadLocalRandomを優先してください。
doubleとガウス分布
nextDouble()は[0,1)の値を返し、nextGaussian()は平均0、標準偏差1の正規分布に従う値を返します。
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random rng = new Random(1);
System.out.println(rng.nextDouble());
System.out.println(rng.nextGaussian());
}
}適切なツールを選ぶ
手軽にdoubleを生成したい場合はMath.random()、範囲やシードを指定したい場合はRandom、並行処理ではThreadLocalRandomを使います。セキュリティが重要な乱数には、代わりにSecureRandomを使ってください。
理解度チェック
乱数についての理解度を確認しましょう。
まとめ
乱数の生成方法を学びました。
Math.random()は[0,1)の範囲のdoubleを返します。Random.nextInt(bound)は0からbound-1までの値を返します。- シードを指定すると、系列を再現できます。
- 並行処理には
ThreadLocalRandomが適しています。
よくある質問
「乱数の生成」レッスンは無料ですか?
はい。「乱数の生成」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。
「乱数の生成」で何を学びますか?
Random と ThreadLocalRandom です。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「乱数の生成」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。