public class Random
extends Object
implements Serializable
java.lang.Object | |
↳ | java.util.Random |
Known Direct Subclasses |
该类的一个实例用于生成伪随机数字流。 该类使用48位种子,使用线性同余公式进行修改。 (见Donald Knuth, “计算机编程的艺术”,第2卷 ,第3.2.1节。)
如果使用相同的种子创建两个Random
实例,并为每个实例调用相同的方法调用序列,则它们将生成并返回相同的数字序列。 为了保证这个属性,为类Random
指定了特定的算法。 为了Java代码的绝对可移植性,Java实现必须使用此处所示的所有类Random
的算法。 但是,类Random
子类可以使用其他算法,只要它们遵守所有方法的一般合同。
由类 Random
实现的算法使用 protected
实用程序方法,在每次调用时可以提供多达32个伪随机生成的位。
许多应用程序会发现方法 random()
更易于使用。
java.util.Random
实例是线程安全的。 但是,跨线程同时使用同java.util.Random
实例可能会遇到争用并导致性能不佳。 考虑在多线程设计中使用ThreadLocalRandom
。
java.util.Random
实例不具有密码安全性。 考虑使用SecureRandom
来获得一个密码安全的伪随机数生成器,供安全敏感的应用程序使用。
Public constructors |
|
---|---|
Random() 创建一个新的随机数生成器。 |
|
Random(long seed) 使用一个 |
Public methods |
|
---|---|
DoubleStream |
doubles(long streamSize) 返回产生所述给定流 |
DoubleStream |
doubles() 返回一个有效无限数量的伪随机数 |
DoubleStream |
doubles(double randomNumberOrigin, double randomNumberBound) 返回伪随机的有效无限流 |
DoubleStream |
doubles(long streamSize, double randomNumberOrigin, double randomNumberBound) 返回产生给定 |
IntStream |
ints(long streamSize) 返回产生所述给定流 |
IntStream |
ints(long streamSize, int randomNumberOrigin, int randomNumberBound) 返回产生给定的 |
IntStream |
ints(int randomNumberOrigin, int randomNumberBound) 返回一个有效的无限数量的伪随机数 |
IntStream |
ints() 返回伪随机 |
LongStream |
longs() 返回值为 |
LongStream |
longs(long streamSize) 返回产生给定 |
LongStream |
longs(long randomNumberOrigin, long randomNumberBound) 返回伪随机的有效无限流 |
LongStream |
longs(long streamSize, long randomNumberOrigin, long randomNumberBound) 返回产生所述给定流 |
boolean |
nextBoolean() 返回下一个伪,均匀分布 |
void |
nextBytes(byte[] bytes) 生成随机字节并将它们放入用户提供的字节数组中。 |
double |
nextDouble() 返回下一个伪随机数,从该随机数生成器的序列中,在 |
float |
nextFloat() 返回下一个伪随机数,从该随机数生成器的序列中,在 |
double |
nextGaussian() 返回下一个伪随机数,高斯(“正常”)分布 |
int |
nextInt() 返回下一个伪,均匀分布 |
int |
nextInt(int n) 返回伪随机的,均匀分布 |
long |
nextLong() 返回下一个伪,均匀分布 |
void |
setSeed(long seed) 使用一个 |
Protected methods |
|
---|---|
int |
next(int bits) 生成下一个伪随机数。 |
Inherited methods |
|
---|---|
From class java.lang.Object
|
Random (long seed)
使用一个long
种子创建一个新的随机数生成器。 种子是由方法next(int)
维护的伪随机数生成器的内部状态的初始值。
调用 new Random(seed)
相当于:
Random rnd = new Random();
rnd.setSeed(seed);
Parameters | |
---|---|
seed |
long : the initial seed |
也可以看看:
DoubleStream doubles (long streamSize)
返回产生给定的 streamSize
个数的伪随机数 streamSize
数据流,每个数值介于零(含)和1( double
)之间。
产生一个伪随机 double
值,就好像它是调用方法 nextDouble()
的结果 nextDouble()
。
Parameters | |
---|---|
streamSize |
long : the number of values to generate |
Returns | |
---|---|
DoubleStream |
a stream of double values |
Throws | |
---|---|
IllegalArgumentException |
if streamSize is less than zero |
DoubleStream doubles ()
返回伪随机 double
值的有效无限流,每个值都在零(含)和一(独占)之间。
产生一个伪随机 double
值,就好像它是调用方法 nextDouble()
的结果 nextDouble()
。
doubles(Long.MAX_VALUE)
.Returns | |
---|---|
DoubleStream |
a stream of pseudorandom double values |
DoubleStream doubles (double randomNumberOrigin, double randomNumberBound)
返回伪随机的有效无限流 double
值,每个符合给定的原点(含)和绑定(独家)。
一个伪随机 double
值被生成,就好像它是用原点和边界调用以下方法的结果一样:
double nextDouble(double origin, double bound) {
double r = nextDouble();
r = r * (bound - origin) + origin;
if (r >= bound) // correct for rounding
r = Math.nextDown(bound);
return r;
}
doubles(Long.MAX_VALUE, randomNumberOrigin, randomNumberBound)
.Parameters | |
---|---|
randomNumberOrigin |
double : the origin (inclusive) of each random value |
randomNumberBound |
double : the bound (exclusive) of each random value |
Returns | |
---|---|
DoubleStream |
a stream of pseudorandom double values, each with the given origin (inclusive) and bound (exclusive) |
Throws | |
---|---|
IllegalArgumentException |
if randomNumberOrigin is greater than or equal to randomNumberBound |
DoubleStream doubles (long streamSize, double randomNumberOrigin, double randomNumberBound)
返回产生所述给定流 streamSize
数的伪随机的 double
值,每个符合给定的原点(含)和结合(不包括)。
一个伪随机 double
值被生成,就好像它是用原点和边界调用以下方法的结果一样:
double nextDouble(double origin, double bound) {
double r = nextDouble();
r = r * (bound - origin) + origin;
if (r >= bound) // correct for rounding
r = Math.nextDown(bound);
return r;
}
Parameters | |
---|---|
streamSize |
long : the number of values to generate |
randomNumberOrigin |
double : the origin (inclusive) of each random value |
randomNumberBound |
double : the bound (exclusive) of each random value |
Returns | |
---|---|
DoubleStream |
a stream of pseudorandom double values, each with the given origin (inclusive) and bound (exclusive) |
Throws | |
---|---|
IllegalArgumentException |
if streamSize is less than zero |
IllegalArgumentException |
if randomNumberOrigin is greater than or equal to randomNumberBound |
IntStream ints (long streamSize)
返回产生所述给定流 streamSize
数的伪随机的 int
值。
生成一个伪随机 int
值,就好像它是调用方法 nextInt()
的结果 nextInt()
。
Parameters | |
---|---|
streamSize |
long : the number of values to generate |
Returns | |
---|---|
IntStream |
a stream of pseudorandom int values |
Throws | |
---|---|
IllegalArgumentException |
if streamSize is less than zero |
IntStream ints (long streamSize, int randomNumberOrigin, int randomNumberBound)
返回产生所述给定流 streamSize
数的伪随机的 int
值,每个符合给定的原点(含)和结合(不包括)。
生成一个伪随机 int
值,就好像它是使用原点和边界调用以下方法的结果一样:
int nextInt(int origin, int bound) {
int n = bound - origin;
if (n > 0) {
return nextInt(n) + origin;
}
else { // range not representable as int
int r;
do {
r = nextInt();
} while (r < origin || r >= bound);
return r;
}
}
Parameters | |
---|---|
streamSize |
long : the number of values to generate |
randomNumberOrigin |
int : the origin (inclusive) of each random value |
randomNumberBound |
int : the bound (exclusive) of each random value |
Returns | |
---|---|
IntStream |
a stream of pseudorandom int values, each with the given origin (inclusive) and bound (exclusive) |
Throws | |
---|---|
IllegalArgumentException |
if streamSize is less than zero, or randomNumberOrigin is greater than or equal to randomNumberBound |
IntStream ints (int randomNumberOrigin, int randomNumberBound)
返回伪随机的有效无限流 int
值,每个符合给定的原点(含)和绑定(独家)。
一个伪随机 int
值被生成,就好像它是使用原点和边界调用以下方法的结果一样:
int nextInt(int origin, int bound) {
int n = bound - origin;
if (n > 0) {
return nextInt(n) + origin;
}
else { // range not representable as int
int r;
do {
r = nextInt();
} while (r < origin || r >= bound);
return r;
}
}
ints(Long.MAX_VALUE, randomNumberOrigin, randomNumberBound)
.Parameters | |
---|---|
randomNumberOrigin |
int : the origin (inclusive) of each random value |
randomNumberBound |
int : the bound (exclusive) of each random value |
Returns | |
---|---|
IntStream |
a stream of pseudorandom int values, each with the given origin (inclusive) and bound (exclusive) |
Throws | |
---|---|
IllegalArgumentException |
if randomNumberOrigin is greater than or equal to randomNumberBound |
IntStream ints ()
返回伪随机值 int
的有效无限流。
产生一个伪随机 int
值,就好像它是调用方法 nextInt()
的结果 nextInt()
。
ints(Long.MAX_VALUE)
.Returns | |
---|---|
IntStream |
a stream of pseudorandom int values |
LongStream longs ()
返回伪随机 long
值的有效无限流。
产生一个伪随机 long
值,就好像它是调用方法 nextLong()
的结果 nextLong()
。
longs(Long.MAX_VALUE)
.Returns | |
---|---|
LongStream |
a stream of pseudorandom long values |
LongStream longs (long streamSize)
返回产生给定 streamSize
个数的伪随机数 long
值的流。
产生一个伪随机 long
值,就好像它是调用方法 nextLong()
的结果 nextLong()
。
Parameters | |
---|---|
streamSize |
long : the number of values to generate |
Returns | |
---|---|
LongStream |
a stream of pseudorandom long values |
Throws | |
---|---|
IllegalArgumentException |
if streamSize is less than zero |
LongStream longs (long randomNumberOrigin, long randomNumberBound)
返回伪随机的有效无限流 long
值,每个符合给定的原点(含)和绑定(独家)。
伪随机值 long
值生成,就好像它是使用原点和边界调用以下方法的结果:
long nextLong(long origin, long bound) {
long r = nextLong();
long n = bound - origin, m = n - 1;
if ((n & m) == 0L) // power of two
r = (r & m) + origin;
else if (n > 0L) { // reject over-represented candidates
for (long u = r >>> 1; // ensure nonnegative
u + m - (r = u % n) < 0L; // rejection check
u = nextLong() >>> 1) // retry
;
r += origin;
}
else { // range not representable as long
while (r < origin || r >= bound)
r = nextLong();
}
return r;
}
longs(Long.MAX_VALUE, randomNumberOrigin, randomNumberBound)
.Parameters | |
---|---|
randomNumberOrigin |
long : the origin (inclusive) of each random value |
randomNumberBound |
long : the bound (exclusive) of each random value |
Returns | |
---|---|
LongStream |
a stream of pseudorandom long values, each with the given origin (inclusive) and bound (exclusive) |
Throws | |
---|---|
IllegalArgumentException |
if randomNumberOrigin is greater than or equal to randomNumberBound |
LongStream longs (long streamSize, long randomNumberOrigin, long randomNumberBound)
返回产生所述给定流 streamSize
数的伪随机的 long
,每个符合给定的原点(含)和结合(不包括)。
一个伪随机 long
值被生成,就好像它是用原点和边界调用以下方法的结果一样:
long nextLong(long origin, long bound) {
long r = nextLong();
long n = bound - origin, m = n - 1;
if ((n & m) == 0L) // power of two
r = (r & m) + origin;
else if (n > 0L) { // reject over-represented candidates
for (long u = r >>> 1; // ensure nonnegative
u + m - (r = u % n) < 0L; // rejection check
u = nextLong() >>> 1) // retry
;
r += origin;
}
else { // range not representable as long
while (r < origin || r >= bound)
r = nextLong();
}
return r;
}
Parameters | |
---|---|
streamSize |
long : the number of values to generate |
randomNumberOrigin |
long : the origin (inclusive) of each random value |
randomNumberBound |
long : the bound (exclusive) of each random value |
Returns | |
---|---|
LongStream |
a stream of pseudorandom long values, each with the given origin (inclusive) and bound (exclusive) |
Throws | |
---|---|
IllegalArgumentException |
if streamSize is less than zero, or randomNumberOrigin is greater than or equal to randomNumberBound |
boolean nextBoolean ()
返回下一个伪,均匀分布boolean
从这个随机数生成器的序列值。 nextBoolean
的总体合同是一个boolean
值被伪随机生成并返回。 值( true
和false
)以(近似)相等的概率产生。
方法 nextBoolean
由类 Random
实现,就像通过:
public boolean nextBoolean() {
return next(1) != 0;
}
Returns | |
---|---|
boolean |
the next pseudorandom, uniformly distributed boolean value from this random number generator's sequence |
void nextBytes (byte[] bytes)
生成随机字节并将它们放入用户提供的字节数组中。 产生的随机字节数等于字节数组的长度。
方法 nextBytes
由类 Random
实现,如同通过:
public void nextBytes(byte[] bytes) {
for (int i = 0; i < bytes.length; )
for (int rnd = nextInt(), n = Math.min(bytes.length - i, 4);
n-- > 0; rnd >>= 8)
bytes[i++] = (byte)rnd;
}
Parameters | |
---|---|
bytes |
byte : the byte array to fill with random bytes |
Throws | |
---|---|
NullPointerException |
if the byte array is null |
double nextDouble ()
返回下一个伪随机数,从该随机数生成器的序列中,在 0.0
和 1.0
之间均匀分布 double
值。
nextDouble
的一般合约是从 0.0d
(含)至 1.0d
(不包括)范围内统一选择(近似)的一个 double
值,伪随机生成并返回。
方法 nextDouble
由类 Random
实现,如同通过:
public double nextDouble() {
return (((long)next(26) << 27) + next(27))
/ (double)(1L << 53);
}
上述描述仅使用了“近似”对冲,因为next
方法仅仅是近似独立选择比特的无偏差源。 如果它是随机选择比特的完美来源,则所示算法将从所述范围中选择double
值,并具有完美的均匀性。
[在Java的早期版本中,结果错误地计算为:
return (((long)next(27) << 27) + next(27))
/ (double)(1L << 54);
This might seem to be equivalent, if not better, but in fact it introduced a large nonuniformity because of the bias in the rounding of floating-point numbers: it was three times as likely that the low-order bit of the significand would be 0 than that it would be 1! This nonuniformity probably doesn't matter much in practice, but we strive for perfection.]
Returns | |
---|---|
double |
the next pseudorandom, uniformly distributed double value between 0.0 and 1.0 from this random number generator's sequence |
也可以看看:
float nextFloat ()
返回下一个伪随机数,从该随机数生成器的序列中,在 0.0
和 1.0
之间均匀分布 float
值。
nextFloat
的总体合同是从0.0f
(含)至1.0f
(不包括)范围内统一选择(近似)一个float
值,伪随机生成并返回。 所有2 24个可能的float
值的形式m x 2 -24 ,其中m是一个小于2 24的正整数,以(近似)相等的概率产生。
方法 nextFloat
由类 Random
实现,如同通过:
public float nextFloat() {
return next(24) / ((float)(1 << 24));
}
仅在前面的描述中使用了“近似”对冲,因为下一个方法仅仅是近似独立选择比特的无偏差源。 如果它是随机选择比特的完美来源,则所示算法将从所述范围中选择float
值,并具有完全一致性。
[在Java的早期版本中,结果错误地计算为:
return next(30) / ((float)(1 << 30));
This might seem to be equivalent, if not better, but in fact it introduced a slight nonuniformity because of the bias in the rounding of floating-point numbers: it was slightly more likely that the low-order bit of the significand would be 0 than that it would be 1.]
Returns | |
---|---|
float |
the next pseudorandom, uniformly distributed float value between 0.0 and 1.0 from this random number generator's sequence |
double nextGaussian ()
从此随机数生成器的序列返回下一个伪随机数,高斯(“正常”)分布 double
值,平均值为 0.0
,标准差为 1.0
。
nextGaussian
的一般合约是从(大约)平均值 0.0
和标准偏差 1.0
的通常正态分布中选择的一个 double
值被伪随机地生成并返回。
方法 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;
}
}
This uses the
polar method of G. E. P. Box, M. E. Muller, and G. Marsaglia, as described by Donald E. Knuth in
The Art of Computer Programming, Volume 3:
Seminumerical Algorithms, section 3.4.1, subsection C, algorithm P. Note that it generates two independent values at the cost of only one call to
StrictMath.log
and one call to
StrictMath.sqrt
.
Returns | |
---|---|
double |
the next pseudorandom, Gaussian ("normally") distributed double value with mean 0.0 and standard deviation 1.0 from this random number generator's sequence |
int nextInt ()
返回下一个伪,均匀分布int
从这个随机数生成器的序列值。 nextInt
的总体合同是一个int
值被伪随机地生成并返回。 所有2 32个可能的int
值都以(近似)相等的概率产生。
方法 nextInt
由类 Random
实现,如同通过:
public int nextInt() {
return next(32);
}
Returns | |
---|---|
int |
the next pseudorandom, uniformly distributed int value from this random number generator's sequence |
int nextInt (int n)
返回伪随机的,均匀分布int
值介于0(含)和指定值(不包括),从该随机数生成器的序列绘制。 nextInt
的一般合同是指定范围内的一个int
值被伪随机地生成并返回。 所有n
可能的int
值都以(近似)相等的概率产生。 方法nextInt(int n)
由类Random
实现,如同通过:
public int nextInt(int n) {
if (n <= 0)
throw new IllegalArgumentException("n must be positive");
if ((n & -n) == n) // i.e., n is a power of 2
return (int)((n * (long)next(31)) >> 31);
int bits, val;
do {
bits = next(31);
val = bits % n;
} while (bits - val + (n-1) < 0);
return val;
}
仅在前面的描述中使用了“近似”对冲,因为下一个方法仅仅是近似独立选择比特的无偏差源。 如果它是随机选择比特的完美来源,则所示算法将从所述范围中选择int
值,并具有完美的均匀性。
该算法有点棘手。 它拒绝会导致不均匀分布的值(由于2 ^ 31不能被n整除)。 价值被拒绝的可能性取决于n。 最坏的情况是n = 2 ^ 30 + 1,拒绝的概率是1/2,并且循环终止前的预期迭代次数是2。
该算法特别处理n是2的幂的情况:它从底层的伪随机数发生器返回正确数量的高阶比特。 在没有特殊处理的情况下,将返回正确数量的低位 。 线性同余伪随机数发生器,例如由这个类实现的线性同余伪随机数发生器,在它们的低阶位的值序列中具有短周期。 因此,如果n是2的小幂次,这种特殊情况大大增加了连续调用此方法返回的值序列的长度。
Parameters | |
---|---|
n |
int : the bound on the random number to be returned. Must be positive. |
Returns | |
---|---|
int |
the next pseudorandom, uniformly distributed int value between 0 (inclusive) and n (exclusive) from this random number generator's sequence |
Throws | |
---|---|
IllegalArgumentException |
if n is not positive |
long nextLong ()
返回下一个伪,均匀分布long
从这个随机数生成器的序列值。 nextLong
的总体合同是一个long
值被伪随机地生成并返回。
方法 nextLong
由类 Random
实现,就像通过:
public long nextLong() {
return ((long)next(32) << 32) + next(32);
}
Because class
Random
uses a seed with only 48 bits, this algorithm will not return all possible
long
values.
Returns | |
---|---|
long |
the next pseudorandom, uniformly distributed long value from this random number generator's sequence |
void setSeed (long seed)
使用一个long
种子设置此随机数生成器的种子。 setSeed
的一般合约是它改变了这个随机数字生成器对象的状态,以便处于与刚刚以参数seed
作为种子创建的完全相同的状态。 方法setSeed
由类Random
通过原子更新种子为
(seed ^ 0x5DEECE66DL) & ((1L << 48) - 1)
and clearing the
haveNextNextGaussian
flag used by
nextGaussian()
.
setSeed
类Random
恰好只使用给定种子的48位。 一般地,然而,压倒一切的方法可以使用的所有64位long
参数作为种子值。
Parameters | |
---|---|
seed |
long : the initial seed |
int next (int bits)
生成下一个伪随机数。 子类应该覆盖这个,因为这被所有其他方法使用。
next
的一般合约是它返回一个int
值,如果参数bits
在1
和32
(含)之间,那么返回值的许多低位将是(近似)独立选择的位值,其中每一个(大致)相同可能是0
或1
。 方法next
由类Random
通过原子更新种子为
(seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1)
and returning
(int)(seed >>> (48 - bits))
.
This is a linear congruential pseudorandom number generator, as defined by D. H. Lehmer and described by Donald E. Knuth in
The Art of Computer Programming, Volume 3:
Seminumerical Algorithms, section 3.2.1.
Parameters | |
---|---|
bits |
int : random bits |
Returns | |
---|---|
int |
the next pseudorandom value from this random number generator's sequence |