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
对于更专业的需求,有两个子类ThreadLocalRandom
和SecureRandom
。
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
相比,它为long
和double
类型添加了带有边界的其他随机生成方法 - 它不将
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获得的随机性仅与提供者和使用的算法一样好。
要获取该类的实例,可以调用以下任一方法:
- 可用的构造函数之一
getInstance()
静态方法之一getInstanceStrong()
静态方法
我建议使用最后一个选项,因为如果没有“强”随机算法可用,它将抛出异常。
“ strong”算法由securerandom.strongAlgorithms
安全属性定义。 在本地开发环境上运行Security.getProperty("securerandom.strongAlgorithms")
产生NativePRNGBlocking:SUN
。 我将让大家决定以PNRG(伪随机数生成器...)为前缀的算法是否足够好。
切记检查$ JAVA_HOME / lib / security / java.security来管理JVM的安全性配置。
java范围性随机数