Java基础:Java 各种随机数生成方式
汇总 Java 的各种随机数生成方式,而不仅只有 java.util.Random 。
Math.random()
Math.random() 静态方法:产生的随机数是 0 - 1 之间的一个 double 值,即 0 <= random <= 1
。
内部实现:首次调用此方法时,调用java.util.Random()
创建一个新的伪随机数生成器,后续调用此方法都将使用此伪随机数生成器。此方法已正确同步,以允许多个线程正确使用。
1 | // Math 类 |
java.util.Random
Random 基本算法:linear congruential pseudorandom number generator (LGC) 线性同余法伪随机数生成器。
Random 的实例是线程安全的,但是,在线程之间并发使用同一 Random 实例可能会引起争用并因此导致性能下降。 考虑改用 java.util.concurrent.ThreadLocalRandom
。
Random 的实例不是加密安全的。 考虑改为使用 link java.security.SecureRandom
来获取加密安全的伪随机数生成器,以供对安全敏感的应用程序使用。
1 | Random random = new Random(); |
Random类提供的方法:API
- nextBoolean() :返回均匀分布的 true 或者 false
- nextBytes(byte[] bytes):生成随机字节并将其放入用户提供的字节数组中,产生的随机字节数等于字节数组的长度。
- nextDouble():返回 0.0 到 1.0 之间的均匀分布的 double
- nextFloat():返回 0.0 到 1.0 之间的均匀分布的 float
- nextGaussian():返回 0.0 到 1.0 之间的高斯分布(即正态分布)的 double
- nextInt():返回均匀分布的 int
- nextInt(int n):返回 0 到 n 之间的均匀分布的 int (包括 0,不包括 n)
- nextLong():返回均匀分布的 long
- setSeed(long seed):设置种子
ThreadLocalRandom
ThreadLocalRandom 是 Java 1.7 提供的,继承 java.util.Random
类。
ThreadLocalRandom:创建线程隔离的随机数生成器,在线程并发环境中,每个线程都有一个独立的随机数生成器。
在并发程序中使用 ThreadLocalRandom
而不是共享的 Random
对象,能够解决线程并发开销和争用,效率更高。
当多个任务(例如每个 ForkJoinTask)在线程池中并行使用随机数时,使用ThreadLocalRandom 特别合适。
ThreadLocalRandom 通常的使用方式是:
1 | ThreadLocalRandom.current().nextX(...) |
SecureRandom
SecureRandom:返回实现指定的随机数生成器(RNG)算法的SecureRandom对象。
1 | // 获取 SecureRandom 实例 |
创建实例
1 | // 使用默认的 SHA1PRNG 算法 |
使用
1 | SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); |
RandomStringUtils
RandomStringUtils 来自 org.apache.commons.lang3 包,生产随机的字符串。内部都是可直接调用的静态方法,方法的第一个传参是 count,指定随机字符串的长度。
1 | public static void main(String[] args) { |
Java基础:Java 各种随机数生成方式
http://blog.gxitsky.com/2020/09/22/Java-jdk-16-random-method/