public class ThreadLocalRandom extends Random
Math
类使用的全局Random
发生器ThreadLocalRandom
,ThreadLocalRandom用内部生成的种子进行初始化,可能不会被修改。
适用时,在并发程序中使用ThreadLocalRandom
而不是共享的Random
对象通常会遇到更少的开销和争用。
当多个任务(例如,每个ForkJoinTask
)在线程池中并行使用随机数时,使用ThreadLocalRandom
是特别合适的。
这个类的用途通常应该是这样的形式: ThreadLocalRandom.current().nextX(...)
(其中X
是Int
, Long
,等)。 当所有用法都是这种形式时,绝对不可能跨多个线程共享一个ThreadLocalRandom
。
该类还提供了其他常用的有界随机生成方法。
ThreadLocalRandom的ThreadLocalRandom
不是加密安全的。 在安全敏感的应用程序中考虑使用SecureRandom
。 此外,默认构造的实例不使用加密随机种子,除非system property java.util.secureRandomSeed
设置为true
。
Modifier and Type | Method and Description |
---|---|
static ThreadLocalRandom |
current()
返回当前线程的
ThreadLocalRandom 。
|
DoubleStream |
doubles()
返回一个有效的无限流的伪随机
double 值,每个值在零(包括)和一(独占)之间。
|
DoubleStream |
doubles(double randomNumberOrigin, double randomNumberBound)
返回一个有效无限的伪随机
double ,每个符合给定的起始(包括)和绑定(排他)的值。
|
DoubleStream |
doubles(long streamSize)
返回一个流,产生给定的
streamSize 伪
double 数值,每个值在零(包括)和一个(独占)之间。
|
DoubleStream |
doubles(long streamSize, double randomNumberOrigin, double randomNumberBound)
返回产生所述给定流
streamSize 数的伪随机的
double 值,每个符合给定的原点(含)和结合(不包括)。
|
IntStream |
ints()
返回一个有效的无限流的伪
int 值。
|
IntStream |
ints(int randomNumberOrigin, int randomNumberBound)
返回一个有效的无限流伪
int 值,它们各自符合给定的起始(包括)和绑定(排他)。
|
IntStream |
ints(long streamSize)
返回一个流,产生给定的
streamSize 数
int 值。
|
IntStream |
ints(long streamSize, int randomNumberOrigin, int randomNumberBound)
返回一个流,产生给定的
streamSize 伪
int 数值
int ,每个值符合给定的起始(包括)和绑定(排他)。
|
LongStream |
longs()
返回一个有效的无限流的伪
long 值。
|
LongStream |
longs(long streamSize)
返回一个流,产生给定的
streamSize 数量的伪
long 值。
|
LongStream |
longs(long randomNumberOrigin, long randomNumberBound)
返回一个有效的无限流伪
long 值,每个值都符合给定的起始(包括)和绑定(排除)。
|
LongStream |
longs(long streamSize, long randomNumberOrigin, long randomNumberBound)
返回一个流,产生给定的
streamSize 数
long ,每个符合给定的起始(包括)和绑定(排他)。
|
protected int |
next(int bits)
生成下一个伪随机数。
|
boolean |
nextBoolean()
返回一个伪
boolean 值
boolean 。
|
double |
nextDouble()
返回在零(包括)和一(独占)之间的伪随机
double 值。
|
double |
nextDouble(double bound)
返回在0.0(含)和指定的界限(排除)之间的伪随机
double 值。
|
double |
nextDouble(double origin, double bound)
返回指定的起始(含)和绑定(排除)之间的伪随机
double 值。
|
float |
nextFloat()
返回在零(包括)和一(独占)之间的伪随机
float 值。
|
double |
nextGaussian()
从该随机数发生器的序列返回下一个伪随机,高斯(“正”)分布的
double 值,平均值为
0.0 ,标准差为
1.0 。
|
int |
nextInt()
返回一个伪
int 值
int 。
|
int |
nextInt(int bound)
返回零(含)和指定的边界(排除)之间的伪
int 值int。
|
int |
nextInt(int origin, int bound)
返回指定原点(含)和指定边界(排除)之间的伪随机
int 值。
|
long |
nextLong()
返回一个伪
long 值
long 。
|
long |
nextLong(long bound)
返回在零(包括)和指定的边界(排除)之间的伪随机
long 值。
|
long |
nextLong(long origin, long bound)
返回指定的起始(含)和指定的绑定(排除)之间的伪随机
long 值。
|
void |
setSeed(long seed)
UnsupportedOperationException 。
|
public static ThreadLocalRandom current()
ThreadLocalRandom
。
ThreadLocalRandom
public void setSeed(long seed)
UnsupportedOperationException
。
不支持在此生成器中设置种子。
setSeed
在类别
Random
seed
- 初始种子
UnsupportedOperationException
- 永远
protected int next(int bits)
Random
复制
next
的一般合同是它返回一个int
值,如果参数bits
在1
和32
(含)之间,则返回值的许多低位将是(大约)独立选择的比特值,其中每个(约)同样可能是0
或1
。 方法next
由类别Random
通过原子地更新种子来实现
(seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1)
并返回
(int)(seed >>> (48 - bits))
.
这是由DH Lehmer定义的线性同余伪随机数生成器,由Donald E. Knuth在“计算机编程艺术 ”第3卷: Seminumerical Algorithms ,第3.2.1节中描述。
public int nextInt(int bound)
int
值。
nextInt
在类别
Random
bound
- 上限(独占)。
必须是积极的。
int
值
IllegalArgumentException
- 如果
bound
public int nextInt(int origin, int bound)
int
值。
origin
- 返回的值最小
bound
- 上限(独占)
int
值
IllegalArgumentException
- 如果
origin
大于或等于
bound
public long nextLong(long bound)
long
值long。
bound
- 上限(独占)。
必须是积极的。
long
值
IllegalArgumentException
- 如果
bound
public long nextLong(long origin, long bound)
long
值long。
origin
- 返回的最小值
bound
- 上限(独占)
long
值
IllegalArgumentException
- 如果
origin
大于或等于
bound
public double nextDouble()
double
值double。
nextDouble
在类别
Random
double
之间的零(含)和一(独占)
Math.random()
public double nextDouble(double bound)
double
值。
bound
- 上限(独占)。
必须是积极的。
double
之间的零(含)和绑定(独占)
IllegalArgumentException
- 如果
bound
public double nextDouble(double origin, double bound)
double
值。
origin
- 返回的值最小
bound
- 上限(独占)
double
值
IllegalArgumentException
- 如果
origin
大于或等于
bound
public boolean nextBoolean()
boolean
值
boolean
。
nextBoolean
在类别
Random
boolean
价值
public float nextFloat()
float
值。
public double nextGaussian()
Random
复制
double
值,平均值为0.0
,标准偏差1.0
为该随机数发生器的序列。
nextGaussian
的一般合同是一个double
价值,从(大约)平均正态分布中选出,平均值为0.0
,标准偏差为1.0
,被伪随机生成并返回。
方法nextGaussian
由类别Random
,好像通过以下的线程安全版本:
private double nextNextGaussian; private boolean haveNextNextGaussian = false; public double nextGaussian() { if (haveNextNextGaussian) { haveNextNextGaussian = false; return nextNextGaussian; } else { double v1, v2, s; do { v1 = 2 * nextDouble() - 1; // between -1.0 and 1.0 v2 = 2 * nextDouble() - 1; // between -1.0 and 1.0 s = v1 * v1 + v2 * v2; } while (s >= 1 || s == 0); double multiplier = StrictMath.sqrt(-2 * StrictMath.log(s)/s); nextNextGaussian = v2 * multiplier; haveNextNextGaussian = true; return v1 * multiplier; } }
这使用GEP Box,ME Muller和G. Marsaglia的极性方法 ,如Donald E. Knuth在“计算机编程艺术 ”第3卷: 半数学算法 ,第3.4.1节,C节,算法P中所述。请注意它产生两个独立的值,只需一次拨打StrictMath.log
,一次拨打StrictMath.sqrt
。
nextGaussian
在类别
Random
double
值,平均值为
0.0
,标准偏差
1.0
为该随机数发生器序列
public IntStream ints(long streamSize)
streamSize
数
int
值。
ints
在类别
Random
streamSize
- 要生成的值的数量
int
值
IllegalArgumentException
- 如果
streamSize
小于零
public IntStream ints()
int
值。
public IntStream ints(long streamSize, int randomNumberOrigin, int randomNumberBound)
streamSize
数的伪随机的
int
值,每个符合给定的原点(含)和结合(不包括)。
ints
在类别
Random
streamSize
- 要生成的值的数量
randomNumberOrigin
- 每个随机值的起点(含)
randomNumberBound
- 每个随机值的绑定(排他)
int
流,每个都有给定的来源(包括)和绑定(排他)
IllegalArgumentException
- 如果
streamSize
小于零,或
randomNumberOrigin
大于或等于
randomNumberBound
public IntStream ints(int randomNumberOrigin, int randomNumberBound)
int
,每个符合给定的原始(包括)和绑定(排他)的值。
ints
在类别
Random
ints(Long.MAX_VALUE, randomNumberOrigin, randomNumberBound)
。
randomNumberOrigin
- 每个随机值的起点(含)
randomNumberBound
- 每个随机值的绑定(排他)
int
的流(int),每个都有给定的起源(包括)和绑定(独占)
IllegalArgumentException
- 如果
randomNumberOrigin
大于或等于
randomNumberBound
public LongStream longs(long streamSize)
streamSize
数
long
值。
longs
在类别
Random
streamSize
- 要生成的值的数量
long
值
IllegalArgumentException
- 如果
streamSize
小于零
public LongStream longs()
long
值。
public LongStream longs(long streamSize, long randomNumberOrigin, long randomNumberBound)
streamSize
数
long
,每个符合给定的起始(包括)和绑定(排他)。
longs
在
Random
streamSize
- 要生成的值的数量
randomNumberOrigin
- 每个随机值的起点(含)
randomNumberBound
- 每个随机值的绑定(排他)
long
的流(long),每个都有给定的来源(包括)和绑定(排他)
IllegalArgumentException
- 如果
streamSize
小于零,或
randomNumberOrigin
大于或等于
randomNumberBound
public LongStream longs(long randomNumberOrigin, long randomNumberBound)
long
值,每个符合给定的起始(包括)和绑定(排他)。
longs
在类别
Random
longs(Long.MAX_VALUE, randomNumberOrigin, randomNumberBound)
。
randomNumberOrigin
- 每个随机值的起点(含)
randomNumberBound
- 每个随机值的绑定(排他)
long
流(long),每个都有给定的来源(包括)和绑定(排他)
IllegalArgumentException
- 如果
randomNumberOrigin
大于或等于
randomNumberBound
public DoubleStream doubles(long streamSize)
streamSize
数
double
值,每个值在零(包括)和一(独占)之间。
doubles
在类别
Random
streamSize
- 要生成的值的数量
double
价值
IllegalArgumentException
- 如果
streamSize
小于零
public DoubleStream doubles()
double
值,每个值在零(包括)和一(独占)之间。
public DoubleStream doubles(long streamSize, double randomNumberOrigin, double randomNumberBound)
streamSize
数,值为
double
,每个符合给定的起始(包括)和绑定(排他)。
doubles
在类别
Random
streamSize
- 要生成的值的数量
randomNumberOrigin
- 每个随机值的起点(含)
randomNumberBound
- 每个随机值的绑定(排他)
double
的流量
double
,每个都有给定的来源(包括)和绑定(排他)
IllegalArgumentException
- 如果
streamSize
小于零
IllegalArgumentException
- 如果
randomNumberOrigin
大于或等于
randomNumberBound
public DoubleStream doubles(double randomNumberOrigin, double randomNumberBound)
double
,每个符合给定的原始(包括)和绑定(排他)的值。
doubles
在类别
Random
doubles(Long.MAX_VALUE, randomNumberOrigin, randomNumberBound)
。
randomNumberOrigin
- 每个随机值的起点(含)
randomNumberBound
- 每个随机值的绑定(排他)
double
流(double),每个都有给定的起始(包括)和绑定(独占)
IllegalArgumentException
- 如果
randomNumberOrigin
大于等于
randomNumberBound