新しいジェネレータの動的な作成
RandomGenerator.SplittableGeneratorインタフェースを実装するPRNGを使用している場合、アプリケーションで実行されているスレッドが新しいスレッドをフォークする必要があるときに、split()メソッドを呼び出します。元のジェネレータと同じプロパティを持つ新しいジェネレータが作成されます。これは、元のジェネレータの周期を2つにパーティション化することによって行われます。各パーティションは、元のジェネレータまたは新しいジェネレータのいずれかが排他的に使用します。
次の例では、RandomGenerator.SplittableGeneratorインタフェースを実装するL128X1024MixRandom PRNGを使用します。IntStream processes
ストリームは、異なるスレッドで実行することを目的としたタスクを表します。
int NUM_PROCESSES = 100;
RandomGeneratorFactory<SplittableGenerator> factory =
RandomGeneratorFactory.of("L128X1024MixRandom");
SplittableGenerator random = factory.create();
IntStream processes = IntStream.rangeClosed(1, NUM_PROCESSES);
processes.parallel().forEach(p -> {
RandomGenerator r = random.split();
System.out.println(p + ": " + r.nextLong());
});
一般に、分割可能なPRNGには、分割の結果として生じる新しいオブジェクトが異なる状態サイクルを使用できるように、長い周期があります。ただし、2つのインスタンスが誤って同じ状態サイクルを使用する場合でも、その共有状態サイクルの異なるリージョンを通過する可能性が高くなります。