0Pricing
Java Academy · レッスン

乱数の生成

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Math クラス
  2. 乱数の生成
  3. 乱数の範囲とシャッフル
  4. Math の丸めと上限・下限
← Java Academyに戻る