java范围性随机数



如果您已经必须在Java上管理一定程度的随机性,那么您很可能熟悉Math.random()方法。 但是,以前的方法返回一个double。 除了非常基本的用例之外,还必须考虑java.util.Random类形式的另一个选项。



随机



此类的实例用于生成伪随机数流。



— JavaDoc
https://docs.oracle.com/javase/8/docs/api/java/util/Random.html


该根类提供基本的随机数生成功能,令人难以置信。

  • 生成一个随机数:
  • boolean
  • byte数组
  • double
  • float ,无论是均匀分布还是高斯分布
  • long
  • int (从0到2 32或特定范围)
  • 生成随机流:
  • int
  • long
  • double

对于更专业的需求,有两个子类ThreadLocalRandomSecureRandom


ThreadLocalRandom


关于Random类的一个问题是,它基于AtomicLong进行数字生成。 根据定义,它是线程安全的,但是如果一次被太多线程使用,则可能会导致性能问题。


当多个任务(例如,每个ForkJoinTask )在线程池中并行使用随机数时,使用ThreadLocalRandom特别合适。


— JavaDoc
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadLocalRandom.html


用法就像:

ThreadLocalRandom.current().nextX(...)// (where X is Int, Long, etc.)


关于ThreadLocalRandom有一些有趣的事情:


  • Random相比,它为longdouble类型添加了带有边界的其他随机生成方法
  • 它不将next(int bits)用于其他随机生成方法,以避免AtomicLong争用


安全随机


关于Random的重要一点是它不提供真正的随机性,而仅提供伪随机性。 从next(int bits)的JavaDoc中next(int bits)所有其他随机生成器方法都依赖于JavaDoc):


这是线性同余伪随机数生成器,由DH Lehmer定义,由Donald E. Knuth在计算机编程艺术,第3卷: 半数值算法 ,第3.2.1节中进行了描述。

相反, SecureRandom提供真正的随机性:



此类提供了加密功能强的随机数生成器(RNG)。



加密强度高的随机数至少符合FIPS 140-2“加密模块的安全性要求”第4.9.1节中指定的统计随机数生成器测试。


— JavaDoc
https://docs.oracle.com/javase/8/docs/api/java/security/SecureRandom.html

此类取决于:


Provider提供( sic )Java Security API的部分或全部。 它具有一个名称, 例如 SunRsaSign和一个版本。


算法

不言自明, 例如 NativePRNG


提供者和算法都是平台相关的。 这意味着使用SecureRandom获得的随机性仅与提供者和使用的算法一样好。


要获取该类的实例,可以调用以下任一方法:


  1. 可用的构造函数之一
  2. getInstance()静态方法之一
  3. getInstanceStrong()静态方法

我建议使用最后一个选项,因为如果没有“强”随机算法可用,它将抛出异常。


“ strong”算法由securerandom.strongAlgorithms安全属性定义。 在本地开发环境上运行Security.getProperty("securerandom.strongAlgorithms")产生NativePRNGBlocking:SUN 。 我将让大家决定以PNRG(伪随机数生成器...)为前缀的算法是否足够好。

切记检查$ JAVA_HOME / lib / security / java.security来管理JVM的安全性配置。



翻译自: https://blog.frankel.ch/managing-randomness-java/

java范围性随机数