RandomGeneratorインターフェース
RandomGeneratorインターフェースを使って、特定クラスに依存せずアルゴリズムを名前で選択する。
コード比較
✕ Java 8
// Hard-coded to one algorithm
Random rng = new Random();
int value = rng.nextInt(100);
// Or thread-local, but still locked in
int value = ThreadLocalRandom.current()
.nextInt(100);
✓ Java 17+
// Algorithm-agnostic via factory
var rng = RandomGenerator.of("L64X128MixRandom");
int value = rng.nextInt(100);
// Or get a splittable generator
var rng = RandomGeneratorFactory
.of("L64X128MixRandom").create();
このコードに問題がありますか? お知らせください。
モダンな方法が優れている理由
アルゴリズム非依存
コード構造を変えることなく、最適なRNGアルゴリズムを名前で選択できます。
より優れたアルゴリズム
優れた統計特性を持つ最新のLXMジェネレーターにアクセスできます。
統一API
1つのインターフェースでRandom、ThreadLocalRandom、SplittableRandomなどを網羅。
旧来のアプローチ
new Random() / ThreadLocalRandom
モダンなアプローチ
RandomGeneratorファクトリー
JDKバージョン
17
難易度
中級
JDKサポート
RandomGeneratorインターフェース
利用可能
JDK 17(2021年9月、JEP 356)以降、利用可能
仕組み
JDK 17ではRandomGeneratorがすべてのRNG実装の共通インターフェースとして導入されました。new Random()やThreadLocalRandomをハードコードする代わりに、ファクトリーを通じてアルゴリズムを名前で選択でき、ユースケース(速度・統計品質・分割可能性)に応じてアルゴリズムを容易に切り替えられます。
関連ドキュメント