Java 乱数ジェネレーター

インタラクティブなコード例でJavaでの乱数生成を学びましょう。Random.nextInt()、SecureRandom、ThreadLocalRandom、Math.random()を詳細な解説付きで紹介します。

Javaコードエディター

インタラクティブなコード例でJavaでの乱数生成を学びましょう。Random.nextInt()、SecureRandom、ThreadLocalRandom、Math.random()を詳細な解説付きで紹介します。

import java.util.Random;

public class RandomExample {
    public static void main(String[] args) {
        Random rand = new Random();
        int min = 1;
        int max = 100;
        int quantity = 5;

        System.out.println("Random numbers between " + min + " and " + max + ":");
        for (int i = 0; i < quantity; i++) {
            int num = rand.nextInt(max - min + 1) + min;
            System.out.print(num + " ");
        }
    }
}

出力

ブラウザーでのプレビューで、JavaやC++を実行しません。値は暗号用途には使えません。

例をプレビュー

java.util.Randomの基本

Random.nextInt()を使用して特定の範囲のランダムな整数を生成します。Javaで最も一般的な一般的用途の乱数生成方法です。

すぐにランダムな数字が必要ですか?

コードを書かずに即座に結果を得られるオンライン乱数ジェネレーターをお試しください。

乱数ジェネレーターを開く

Javaの乱数生成を理解する

Javaには複数の乱数生成方法があり、それぞれ異なるユースケースに最適化されています。java.util.Randomは線形合同生成器(LCG)アルゴリズムを使用し、SecureRandomは暗号学的に強力な乱数を提供し、ThreadLocalRandomは並行アプリケーション向けのスレッドセーフな生成を提供し、Math.random()はランダムなdoubleを生成するシンプルな方法を提供します。

java.util.Random クラス

java.util.Randomは、シミュレーション、ゲーム、一般的なプログラミングタスクに適した高速な疑似乱数生成を提供します。基本的な使用ではスレッドセーフです。

セキュアランダム

java.security.SecureRandomはプラットフォーム固有のアルゴリズム(SHA1PRNG、NativePRNG)を使用して、セキュリティアプリケーション向けの暗号学的に安全な乱数を生成します。

ThreadLocalRandom クラス

ThreadLocalRandomは、マルチスレッドアプリケーション向けに特別に設計された効率的なスレッドセーフな乱数生成を提供し、競合と同期オーバーヘッドを回避します。

Math.random()

Math.random()は0.0から1.0の間のdouble値を返すシンプルなメソッドです。簡単な計算に便利ですが、他のオプションほど柔軟ではありません。

一般的なユースケース

ゲーム&シミュレーション

Random.nextInt()やThreadLocalRandomを使用して、ゲームループ内でランダムなサイコロ、カード抽選、敵のスポーン、ゲームイベントを生成。

セキュリティ&暗号

SecureRandomを使用して、暗号強度のランダム性を持つ安全なパスワード、APIキー、セッショントークン、暗号化ソルトを作成。

並行アプリケーション

ThreadLocalRandomを並列ストリームやマルチスレッドアプリケーションで使用して、競合を回避しパフォーマンスを向上。

ソフトウェアテスト

ランダム化されたテストデータ、ファズテスト入力、エッジケースを作成して、Javaアプリケーションの堅牢なコードカバレッジとバグ検出を確保。

Javaの乱数生成の仕組み

Javaの java.util.Random クラスは、48ビットシードを使用する線形合同生成器(LCG)アルゴリズムを使用します。疑似乱数を生成するシンプルな方法を提供し、スレッドセーフのために同期化されています。

SecureRandom クラスは、プラットフォーム固有の実装を使用して暗号学的に強力な乱数を提供します。ほとんどのシステムでは、オペレーティングシステムのエントロピーソースまたはハードウェア乱数生成器を使用します。

Java 7で導入された ThreadLocalRandom は、マルチスレッドアプリケーション向けに設計されています。現在のスレッドに分離された乱数生成器を使用し、同期オーバーヘッドと競合を回避します。

実用上の注意

🎯

適切なAPIを選択する

シンプルなケースにはRandom、セキュリティにはSecureRandom、並行アプリにはThreadLocalRandom、クイックプロトタイプにのみMath.random()を使用しましょう。それぞれに固有のユースケースがあります。

🔒

セキュリティには常にSecureRandomを使用

パスワード、トークン、または暗号操作にRandomやMath.random()を絶対に使用しないでください。強力なランダム性を確保し予測可能なパターンを回避するために、常にSecureRandomを使用してください。

⚡

並行アクセスの最適化

マルチスレッドアプリケーションでは、ThreadLocalRandomはRandomオブジェクトの同期化よりも大幅に高速です。並列ストリームや並行コレクションで使用してください。

技術仕様

アルゴリズム

  • 線形合同生成器(Randomクラス)
  • SHA1PRNGまたはNativePRNG(SecureRandom)
  • ThreadLocalRandom(Java 7+、Randomベース)
  • 疑似乱数double(Math.random())

パフォーマンス特性

  • Math.random():シンプルなdouble向けに最速
  • ThreadLocalRandom:並行アクセスに最適
  • Random:一般的な用途に良好、同期オーバーヘッドあり
  • SecureRandom:エントロピー収集のため低速

よくある質問

どの Java API がカバーされていますか?

java.util.Random、SecureRandom、ThreadLocalRandom、および Math.random() には、それぞれに焦点を当てた例が含まれています。

サンプルをカスタマイズできますか?

はい。パラメータ パネルで最小値、最大値、数量を設定し、実行すると結果が即座に表示されます。

セキュリティにはどれを使用すればよいですか?

SecureRandom。他の API は予測可能であり、トークン、キー、パスワードをバックしてはなりません。

マルチスレッド コードについてはどうですか?

ThreadLocalRandom はスレッド間の競合を回避し、並列ストリームおよびスレッド プール内の通常の選択です。

Javaで2つの値の間の乱数を生成するにはどうすればよいですか?

nextInt(bound)を呼び出すと0からbound-1までの値が得られます。例えばnextInt(50)なら0〜49の値が生成されます。カスタム範囲が必要な場合はオフセットを加えます。nextInt(10) + 5とすれば5〜14の値が生成されます。Java 17以降では、nextInt(origin, bound)と書けば1回の呼び出しで実現でき、originは範囲に含まれ、boundは含まれません。

Math.random()は1を返すことはありますか?

いいえ。Math.random()は0.0以上1.0未満のdoubleを返すため、0.0や0.9999は出現しますが、1.0が返されることはありません。内部的には単一のjava.util.Randomインスタンスに処理を委譲しているため、モダンなコードではRandomのメソッドを直接呼び出す方が明確です。

プログラムを実行するたびに同じ乱数が生成されるのはなぜですか?

new Random(42)のように固定シードを指定して作成したRandomは、常に同一の数列を再現します。シード引数を省略すれば、System.nanoTime()と組み合わせた一意の値から自動的にシードが設定されます。固定シードは再現性のあるテストやデバッグには便利ですが、本番コードでは使わないようにしましょう。

配列やリストからランダムな要素を選択するにはどうすればよいですか?

インデックスを生成してその位置の要素を取得します。nextInt(n)は0からn-1までの範囲をカバーするため、リストならlist.get(random.nextInt(list.size()))、配列ならarray[random.nextInt(array.length)]を使用します。あるいは、Collections.shuffle()を使えばリスト全体の順序を1回の処理でランダム化できるため、1回のシャッフル内で同じ要素が重複することはありません。

参考資料・リソース