cpp*_*ner 13 java random java-17
Java 17 引入了一个RandomGeneratorFactory用于实例化随机数生成器的新类。该create(long)方法描述为
创建一个
RandomGenerator基于所选算法的实例,提供起始长种子。如果算法不支持长种子,则使用无参数形式的 create。
然而,似乎没有一种方法RandomGeneratorFactory可以用来确定是否long支持种子。如何使用新 API 来获取RandomGenerator保证使用提供的种子创建的实例long?
也许这不是您想要的答案,但在阅读您的问题后我很好奇并想:为什么不直接探测有问题的生成器呢?因此,我用启发式方法创建了一个小临时文件:
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)
| 归档时间: |
|
| 查看次数: |
572 次 |
| 最近记录: |