Java 17 中的种子随机生成器

cpp*_*ner 13 java random java-17

Java 17 引入了一个RandomGeneratorFactory用于实例化随机数生成器的新类。该create(long)方法描述为

创建一个RandomGenerator基于所选算法的实例,提供起始长种子。如果算法不支持长种子,则使用无参数形式的 create。

然而,似乎没有一种方法RandomGeneratorFactory可以用来确定是否long支持种子。如何使用新 API 来获取RandomGenerator保证使用提供的种子创建的实例long

kri*_*aex 1

也许这不是您想要的答案,但在阅读您的问题后我很好奇并想:为什么不直接探测有问题的生成器呢?因此,我用启发式方法创建了一个小临时文件:

import java.util.List;
import java.util.random.RandomGenerator;
import java.util.random.RandomGeneratorFactory;

import static java.util.stream.Collectors.toList;

class RandomGeneratorTool_73185029 {
  public static void main(String[] args) {
    RandomGeneratorFactory.all()
      .map(factory -> String.format("%-21s -> %sseedable", factory.name(), isSeedable(factory) ? "" : "not "))
      .forEach(System.out::println);
  }

  public static boolean isSeedable(RandomGeneratorFactory<RandomGenerator> factory) {
    final int ROUNDS = 3, NUMBERS_PER_ROUND = 100, SEED = 123;
    List<Integer>[] randomNumbers = new List[ROUNDS];
    for (int round = 0; round < ROUNDS; round++) {
      randomNumbers[round] = factory.create(SEED).ints(NUMBERS_PER_ROUND).boxed().collect(toList());
      if (round > 0 && !randomNumbers[round - 1].equals(randomNumbers[round]))
        return false;
    }
    return true;
  }
}
Run Code Online (Sandbox Code Playgroud)

在 JDK 21 上,打印:

L32X64MixRandom       -> seedable
L128X128MixRandom     -> seedable
L64X128MixRandom      -> seedable
SecureRandom          -> not seedable
L128X1024MixRandom    -> seedable
L64X128StarStarRandom -> seedable
Xoshiro256PlusPlus    -> seedable
L64X256MixRandom      -> seedable
Random                -> seedable
Xoroshiro128PlusPlus  -> seedable
L128X256MixRandom     -> seedable
SplittableRandom      -> seedable
L64X1024MixRandom     -> seedable
Run Code Online (Sandbox Code Playgroud)