java范围性随机数_用Java管理随机性

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

随机类层次结构
图1.随机类的层次结构

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节中进行了描述。
— JavaDoc
http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/Random.java#l188

相反, 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范围性随机数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值