gpt4 book ai didi

java - Java中不重复的随机数生成

转载 作者:行者123 更新时间:2023-12-01 07:33:27 25 4
gpt4 key购买 nike

我想获得有关伪随机数生成的澄清。我的问题是:

  • 伪随机数生成中是否有机会获得重复的数字?

  • 当我用谷歌搜索时,我发现了真正的随机数生成。我可以获得一些真正的随机数生成算法,以便我可以将其与

    一起使用

    SecureRandom.getInstance(String algorithm)

请给予指导,并优先考虑安全。

最佳答案

1) 是的,PRNG 中通常可以有重复的数字。实际上,如果你应用鸽子洞原理,证明是非常简单的(即,假设你在 32 位无符号整数集合上有一个 PRNG;如果你生成超过 2^32 个伪随机数,你肯定会得到至少有一个数字至少生成 2 次;实际上,这会发生得更快;通常 PRNG 的算法将循环遍历一个序列,并且您有一种方法来计算或估计该循环的大小,在每个循环结束时单个数字将开始重复,并且算法的图像通常比您从中获取数字的集合小得多。

如果您需要不重复的数字(因为安全性似乎是您关心的问题,请注意,这不如允许重复数字的(伪)随机数字序列安全! !!),您可以执行以下操作:

class NonRepeatedPRNG {
private final Random rnd = new Random();
private final Set<Integer> set = new HashSet<>();
public int nextInt() {
for (;;) {
final int r = rnd.nextInt();
if (set.add(r)) return r;
}
}
}

请注意,上面定义的 nextInt 方法可能永远不会返回!谨慎使用。

2)不,不存在“真正的随机数生成算法”这样的东西,因为算法是已知的,你可以控制并可以预测(即,只需运行它,你就会得到输出;你确切地知道下次在相同的初始条件下运行它时它的输出),而根据定义,真正的 RNG 是完全不可预测的。

对于大多数常见的非安全相关应用程序(即科学计算、游戏等),PRNG 就足够了。如果安全性是一个问题(即,您需要随机数进行加密),那么 CSPRNG(加密安全 PRNG)就足够了。

如果您的应用程序没有真正的随机性就无法工作,我真的很想了解更多信息。

关于java - Java中不重复的随机数生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15308167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com