PRNGアルゴリズムの選択

暗号で保護されたアルゴリズムを必要としないアプリケーション(物理的なシミュレーション、機械学習、ゲームなど)のために、java.util.randomパッケージでは、速度、スペース、周期、偶発的な相関および等分布を含む1つ以上のPRNGプロパティに焦点を当てたインタフェースRandomGeneratorの複数の実装を提供しています。

ノート:

PRNGアルゴリズムの進化に伴い、Java SEは新しいPNGアルゴリズムを追加し、古いアルゴリズムを非推奨にする場合があります。非推奨のアルゴリズムは使用しないことをお薦めします。将来のJava SEリリースから削除される可能性があります。アルゴリズムが非推奨になっているかどうかをチェックするには、RandomGenerator.isDeprecated()またはRandomGeneratorFactory.isDeprecated()メソッドを呼び出します。

暗号で保護

暗号で保護された乱数ジェネレータ・アルゴリズムを必要とするアプリケーションの場合、java.securityパッケージのSecureRandomクラスを使用します。

詳細は、『Java Platform, Standard Editionセキュリティ開発者ガイド』「SecureRandomクラス」を参照してください。

汎用

特別な要件のないアプリケーションでは、L64X128MixRandomは、速度、スペースおよび周期のバランスをとります。適切に使用すると、シングル・スレッドとマルチ・スレッドの両方のアプリケーションに適しています(スレッドごとに個別のインスタンス)。

シングル・スレッド、高パフォーマンス

シングル・スレッド・アプリケーションの場合、Xoroshiro128PlusPlusは、小規模および高速で、十分な長さの周期を持っています。

32ビット・アプリケーション

32ビット環境で動作し、1つまたは少数のスレッドのみを使用するアプリケーションの場合、L32X64StarStarRandomまたはL32X64MixRandomを選択することをお薦めします。

静的スレッドを持つマルチスレッド・アプリケーション

計算の開始時に1つのバッチで割り当てられる多数のスレッドを使用するアプリケーションの場合、Xoroshiro128PlusPlusやXoshiro256PlusPlusなどのジャンプ可能なジェネレータ、またはL64X128MixRandomやL64X256MixRandomなどの分割可能なジェネレータを検討してください。アプリケーションが、32ビット未満の浮動小数点精度が必要で、正確な等分布が不要な均一分布の浮動小数点値のみを使用する場合、クラシックでよく研究されたアルゴリズムであるMRG32k3aが適切である可能性があります。

動的スレッドを持つマルチスレッド・アプリケーション

スプリッタなどの使用によって多数のスレッドを動的に作成するアプリケーションの場合、L64X128MixRandomやL64X256MixRandomなどの分割可能なジェネレータをお薦めします。

動的に作成されるジェネレータの数が非常に多い(数百万以上)場合、L128X128MixRandomやL128X256MixRandomなどのジェネレータを使用すると、2つのインスタンスが同じ状態サイクルを使用する可能性が大幅に低くなります。

連続して生成された値のタプル

連続して生成された値のタプルを使用するアプリケーションの場合、kが生成されるタプルの長さ以上になるように、kが等分布されたジェネレータを検討してください。たとえば、ジェネレータ L64X256MixRandomは4等分布であることが示されています。つまり、4つの値を含むタプルのシーケンスを持つことができ、これらのタプルは均一に分布されます(4つのタプルがシーケンスに表示される可能性は同等です)。また、L64X1024MixRandomが16等分布であることも示されています。

大きな順列

大きな順列を生成するアプリケーションの場合、可能な順列の総数よりも周期がはるかに大きいジェネレータを検討してください。そうしないと、意図した順列の一部を生成できなくなります。たとえば、1組52枚のカードをシャッフルする目的の場合、可能な順列の数は52! (52階乗)です。これは約2225.58であるため、L64X256MixRandom、L64X1024MixRandom、L128X256MixRandom、L128X1024MixRandomなど、周期が約2256以上のジェネレータの使用が最適です。