RandomGeneratorインタフェースを使用した擬似乱数の生成

次の例は、PRNGを作成し、それを使用して乱数を生成するための基本的な方法を示しています:

        RandomGenerator random1 = RandomGenerator.of("Random");
        long value1 = random1.nextLong();
        System.out.println(value1);

メソッドRandomGenerator.of(String)を使用します。このメソッドの引数は、PRNGのアルゴリズム名です。Java SEには多数のPRNGクラスが含まれています。ただし、Randomとは異なり、そのほとんどはjdk.randomパッケージに含まれています。

RandomGeneratorインタフェースには、nextLong()nextInt()nextDouble()nextBoolean()など、様々なプリミティブ・データ型の乱数を生成する多くのメソッドが含まれています。

次の例は、RandomGeneratorFactoryクラスを使用してPRNGを作成する方法を示しています:

        RandomGeneratorFactory<RandomGenerator> factory2 =
            RandomGeneratorFactory.of("SecureRandom");
        RandomGenerator random2 = factory2.create();
        long value2 = random2.nextLong();
        System.out.println(value2); 

Java SEによって実装されたPRNGのリストを取得するには、RandomGeneratorFactory.all()メソッドを呼び出します:

        RandomGeneratorFactory.all()
            .map(f -> f.name())
            .sorted()
            .forEach(n -> System.out.println(n));

このメソッドは、使用可能なすべてのRandomGeneratorFactoryインスタンスのストリームを返します。

RandomGeneratorFactoryクラスを使用して、アルゴリズム名以外の特性に基づいてPRNGを作成できます。次の例では、最長周期のPRNGを検索し、この特性に基づいてRandomGeneratorFactoryを作成します:

        RandomGeneratorFactory<RandomGenerator> greatest =
            RandomGeneratorFactory
                .all()
                .sorted((f, g) -> g.period().compareTo(f.period()))
                .findFirst()
                .orElse(RandomGeneratorFactory.of("Random"));
        System.out.println(greatest.name());
        System.out.println(greatest.group());
        System.out.println(greatest.create().nextLong());