- java.lang.Object
-
- java.util.Random
-
- 实现的所有接口
-
Serializable
- 已知直接子类:
-
SecureRandom
,ThreadLocalRandom
public class Random extends Object implements Serializable
该类的实例用于生成伪随机数流。 该类使用48位种子,使用线性同余公式进行修改。 (参见Donald Knuth, 计算机程序设计的艺术,第2卷 ,第3.2.1节。)如果使用相同的种子创建了两个
Random
实例,并且对每个实例都进行了相同的方法调用序列,则它们将生成并返回相同的数字序列。 为了保证此属性,为类Random
指定了特定算法。 为了Java代码的绝对可移植性,Java实现必须使用此处所示的所有算法用于类Random
。 但是,允许类Random
子类使用其他算法,只要它们遵守所有方法的一般合同即可。由类
Random
实现的算法使用protected
实用程序方法,在每次调用时,该方法可以提供多达32个伪随机生成的位。许多应用程序将发现方法
Math.random()
更易于使用。java.util.Random
实例是线程安全的。 但是,跨线程同时使用相同的java.util.Random
实例可能会遇到争用,从而导致性能不佳。 请考虑在多线程设计中使用ThreadLocalRandom
。java.util.Random
实例不具有加密安全性。 请考虑使用SecureRandom
来获取加密安全的伪随机数生成器,以供安全敏感应用程序使用。- 从以下版本开始:
- 1.0
- 另请参见:
- Serialized Form
-
-
方法摘要
所有方法 实例方法 具体的方法 变量和类型 方法 描述 DoubleStream
doubles()
返回有效无限的伪随机double
流double
,每个值在零(包括)和一(不包括)之间。DoubleStream
doubles(double randomNumberOrigin, double randomNumberBound)
返回有效无限的伪随机double
流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
值的流,每个值符合给定的原点(包括)和绑定(不包括)。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
个伪随机数streamSize
的流,每个伪long
都符合给定的原点(包括)和绑定(不包括)。protected int
next(int bits)
生成下一个伪随机数。boolean
nextBoolean()
返回下一个伪随机数,从该随机数生成器的序列中均匀分布boolean
值。void
nextBytes(byte[] bytes)
生成随机字节并将它们放入用户提供的字节数组中。double
nextDouble()
从该随机数生成器的序列返回下一个伪随机数,在0.0
和1.0
之间均匀分布double
值。float
nextFloat()
返回下一个伪随机数,从该随机数生成器的序列中均匀分布float
之间的值0.0
和1.0
。double
nextGaussian()
返回下一个伪随机数,高斯(“正常”)分布double
值,平均值为0.0
,标准差为1.0
来自此随机数生成器的序列。int
nextInt()
返回下一个伪随机数,从该随机数生成器的序列中均匀分布int
值。int
nextInt(int bound)
返回从该随机数生成器的序列中提取的伪随机,均匀分布的值在0(包括)和指定值(不包括)之间的int
。long
nextLong()
返回下一个伪随机数,从该随机数生成器的序列中均匀分布long
值。void
setSeed(long seed)
使用单个long
种子设置此随机数生成器的种子。
-
-
-
构造方法详细信息
-
Random
public Random()
创建一个新的随机数生成器。 此构造函数将随机数生成器的种子设置为非常可能与此构造函数的任何其他调用不同的值。
-
Random
public Random(long seed)
使用单个long
种子创建新的随机数生成器。 种子是伪随机数发生器的内部状态的初始值,其由方法next(int)
维护。调用
new Random(seed)
相当于:Random rnd = new Random(); rnd.setSeed(seed);
- 参数
-
seed
- 初始种子 - 另请参见:
-
setSeed(long)
-
-
方法详细信息
-
setSeed
public void setSeed(long seed)
使用单个long
种子设置此随机数生成器的种子。setSeed
的一般合同是它改变了这个随机数生成器对象的状态,以便与刚刚用参数seed
作为种子创建的状态完全相同。 方法setSeed
由类Random
通过原子地更新种子来实现(seed ^ 0x5DEECE66DL) & ((1L << 48) - 1)
haveNextNextGaussian
由已使用标志nextGaussian()
。类
Random
的setSeed
的实现恰好仅使用给定种子的48位。 但是,通常,重写方法可以使用long
参数的所有64位作为种子值。- 参数
-
seed
- 初始种子
-
next
protected int next(int bits)
生成下一个伪随机数。 子类应该覆盖它,因为所有其他方法都使用它。next
的一般合同是它返回int
值,如果参数bits
介于1
和32
(含)之间,那么返回值的那么多低位将是(近似)独立选择的位值,每个位值都是(大约)同样可能是0
或1
。 方法next
由类Random
通过原子地更新种子来实现(seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1)
(int)(seed >>> (48 - bits))
.- 参数
-
bits
- 随机位 - 结果
- 来自此随机数生成器序列的下一个伪随机值
- 从以下版本开始:
- 1.1
-
nextBytes
public 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; }
- 参数
-
bytes
- 用随机字节填充的字节数组 - 异常
-
NullPointerException
- 如果字节数组为空 - 从以下版本开始:
- 1.1
-
nextInt
public int nextInt()
返回下一个伪随机数,从该随机数生成器的序列中均匀分布int
值。nextInt
的一般合同是伪随机生成并返回一个int
值。 所有2 32个可能的int
值以(近似)相等的概率产生。方法
nextInt
由类Random
实现,如同:public int nextInt() { return next(32); }
- 结果
-
下一个伪随机数,从该随机数生成器的序列中均匀分布
int
值
-
nextInt
public int nextInt(int bound)
返回从此随机数生成器的序列中提取的伪随机,均匀分布的值在0(包括)和指定值(不包括)之间的int
值。nextInt
的一般合同是伪随机生成并返回指定范围内的一个int
值。 所有bound
可能的int
值以(近似)相等的概率产生。 方法nextInt(int bound)
由类Random
实现,如同:public int nextInt(int bound) { if (bound <= 0) throw new IllegalArgumentException("bound must be positive"); if ((bound & -bound) == bound) // i.e., bound is a power of 2 return (int)((bound * (long)next(31)) >> 31); int bits, val; do { bits = next(31); val = bits % bound; } while (bits - val + (bound-1) < 0); return val; }
在前面的描述中使用套期“近似”仅仅因为下一个方法仅是大致独立选择的比特的无偏源。 如果它是随机选择位的完美来源,则所示算法将从所述范围中选择具有完美均匀性的
int
值。该算法有点棘手。 它拒绝会导致分布不均匀的值(由于2 ^ 31不能被n整除)。 值被拒绝的概率取决于n。 最坏的情况是n = 2 ^ 30 + 1,其中拒绝的概率是1/2,并且循环终止之前的预期迭代次数是2。
该算法特别处理n是2的幂的情况:它从底层伪随机数发生器返回正确数量的高阶位。 在没有特殊处理的情况下,将返回正确数量的低位 。 已知线性同余伪随机数发生器(例如由该类实现的那些)在其低阶位的值序列中具有短周期。 因此,如果n是2的小幂,则这种特殊情况极大地增加了由此方法的连续调用返回的值序列的长度。
- 参数
-
bound
- 上限(不包括)。 必须是积极的。 - 结果
-
下一个伪均匀分布
int
之间的值零(含)及bound
(不含)从该随机数生成器的序列 - 异常
-
IllegalArgumentException
- 如果绑定不是正面的 - 从以下版本开始:
- 1.2
-
nextLong
public long nextLong()
返回下一个伪随机数,从该随机数生成器的序列中均匀分布long
值。nextLong
的一般合同是伪随机生成并返回一个long
值。方法
nextLong
由类Random
实现,如同:public long nextLong() { return ((long)next(32) << 32) + next(32); }
Random
使用仅48位的种子,所以此算法不会返回所有可能的long
值。- 结果
-
下一个伪随机数,从该随机数生成器的序列中均匀分布
long
值
-
nextBoolean
public boolean nextBoolean()
返回下一个伪随机数,从该随机数生成器的序列中均匀分布boolean
值。nextBoolean
的一般合同是伪随机生成并返回一个boolean
值。 以(近似)相等的概率产生值true
和false
。方法
nextBoolean
由类Random
实现,如同:public boolean nextBoolean() { return next(1) != 0; }
- 结果
-
下一个伪随机数,从该随机数生成器的序列中均匀分布
boolean
值 - 从以下版本开始:
- 1.2
-
nextFloat
public float nextFloat()
返回下一个伪随机数,从该随机数生成器的序列中均匀分布在0.0
和1.0
之间的float
值。nextFloat
的总合同是伪随机生成并返回的一个float
值,从(范围0.0f
(含))到1.0f
(不包括)范围内均匀地选择(大约)。 形式为m× 2 -24的所有2 24个可能的float
值(其中m是小于2 24的正整数)以(近似)相等的概率产生。方法
nextFloat
由类Random
实现,如同:public float nextFloat() { return next(24) / ((float)(1 << 24)); }
在前面的描述中使用套期“近似”仅仅因为下一个方法仅是大致独立选择的比特的无偏源。 如果它是随机选择位的完美来源,则所示算法将从所述范围中选择具有完美均匀性的
float
值。[在Java的早期版本中,结果被错误地计算为:
return next(30) / ((float)(1 << 30));
- 结果
-
下一个伪随机数,从该随机数生成器序列中均匀分布
float
之间的值0.0
和1.0
-
nextDouble
public 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);
- 结果
-
下一个伪随机数,从该随机数发生器序列中均匀分布
double
值0.0
和1.0
之间的值 - 另请参见:
-
Math.random()
-
nextGaussian
public double nextGaussian()
返回下一个伪随机数,高斯(“正常”)分布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; } }
StrictMath.log
和一次调用StrictMath.sqrt
。- 结果
-
下一个伪随机数,高斯(“正常”)分布
double
值,平均值为0.0
,标准差为1.0
来自此随机数生成器的序列
-
ints
public IntStream ints(long streamSize)
- 参数
-
streamSize
- 要生成的值的数量 - 结果
-
伪随机
int
值的流 - 异常
-
IllegalArgumentException
- 如果streamSize
小于零 - 从以下版本开始:
- 1.8
-
ints
public IntStream ints()
- Implementation Note:
-
实现此方法等同于
ints(Long.MAX_VALUE)
。 - 结果
-
伪随机
int
流int
- 从以下版本开始:
- 1.8
-
ints
public IntStream ints(long streamSize, int randomNumberOrigin, int randomNumberBound)
返回产生给定streamSize
个伪随机数int
值的流,每个值符合给定的原点(包括)和bound(不包括)。生成伪随机数
int
值,就好像它是使用origin和bound调用以下方法的结果: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; } }
- 参数
-
streamSize
- 要生成的值的数量 -
randomNumberOrigin
- 每个随机值的原点(包括) -
randomNumberBound
- 每个随机值的边界(不包括) - 结果
-
伪随机
int
流int
,每个值都有给定的原点(包括)和绑定(不包括) - 异常
-
IllegalArgumentException
- 如果streamSize
小于零,或randomNumberOrigin
大于或等于randomNumberBound
- 从以下版本开始:
- 1.8
-
ints
public IntStream ints(int randomNumberOrigin, int randomNumberBound)
返回有效无限的伪随机int
流int
,每个值都符合给定的原点(包括)和绑定(不包括)。生成伪随机数
int
值,就好像它是使用origin和bound调用以下方法的结果: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; } }
- Implementation Note:
-
实现此方法等同于
ints(Long.MAX_VALUE, randomNumberOrigin, randomNumberBound)
。 - 参数
-
randomNumberOrigin
- 每个随机值的原点(包括) -
randomNumberBound
- 每个随机值的边界(不包括) - 结果
-
伪随机
int
流int
,每个值都有给定的原点(包括)和绑定(不包括) - 异常
-
IllegalArgumentException
- 如果randomNumberOrigin
大于或等于randomNumberBound
- 从以下版本开始:
- 1.8
-
longs
public LongStream longs(long streamSize)
返回产生给定streamSize
个伪随机long
值的流。生成伪随机数
long
值,就好像它是调用方法nextLong()
的结果一样 。- 参数
-
streamSize
- 要生成的值的数量 - 结果
-
伪随机
long
值的流 - 异常
-
IllegalArgumentException
- 如果streamSize
小于零 - 从以下版本开始:
- 1.8
-
longs
public LongStream longs()
返回有效无限的伪随机long
流long
。生成伪随机数
long
值,就好像它是调用方法nextLong()
的结果一样 。- Implementation Note:
-
实现此方法等同于
longs(Long.MAX_VALUE)
。 - 结果
-
伪随机
long
值的流 - 从以下版本开始:
- 1.8
-
longs
public LongStream longs(long streamSize, long randomNumberOrigin, long randomNumberBound)
返回产生给定streamSize
个伪随机数streamSize
的流,每个伪long
都符合给定的原点(包括)和bound(不包括)。生成伪随机数
long
值,就好像它是使用origin和bound调用以下方法的结果: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; }
- 参数
-
streamSize
- 要生成的值的数量 -
randomNumberOrigin
- 每个随机值的原点(包括) -
randomNumberBound
- 每个随机值的绑定(不包括) - 结果
-
伪随机
long
值的流,每个值都具有给定的原点(包括)和绑定(不包括) - 异常
-
IllegalArgumentException
- 如果streamSize
小于零,或randomNumberOrigin
大于或等于randomNumberBound
- 从以下版本开始:
- 1.8
-
longs
public LongStream longs(long randomNumberOrigin, long randomNumberBound)
返回有效无限的伪随机long
值流,每个值符合给定的原点(包括)和绑定(不包括)。生成伪随机数
long
,就好像它是使用origin和bound调用以下方法的结果: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; }
- Implementation Note:
-
实现此方法等效于
longs(Long.MAX_VALUE, randomNumberOrigin, randomNumberBound)
。 - 参数
-
randomNumberOrigin
- 每个随机值的原点(包括) -
randomNumberBound
- 每个随机值的边界(不包括) - 结果
-
伪随机
long
值的流,每个值都具有给定的原点(包括)和绑定(不包括) - 异常
-
IllegalArgumentException
- 如果randomNumberOrigin
大于或等于randomNumberBound
- 从以下版本开始:
- 1.8
-
doubles
public DoubleStream doubles(long streamSize)
返回产生给定streamSize
个伪随机double
值的流,每个值在零(包括)和一个(不包括)之间。生成伪随机数
double
,就好像它是调用方法nextDouble()
的结果一样 。- 参数
-
streamSize
- 要生成的值的数量 - 结果
-
一个
double
值的流 - 异常
-
IllegalArgumentException
- 如果streamSize
小于零 - 从以下版本开始:
- 1.8
-
doubles
public DoubleStream doubles()
返回有效无限的伪随机double
流double
,每个值在零(包括)和一(不包括)之间。生成伪随机数
double
值,就好像它是调用方法nextDouble()
的结果一样 。- Implementation Note:
-
实现此方法等同于
doubles(Long.MAX_VALUE)
。 - 结果
-
伪随机
double
流double
- 从以下版本开始:
- 1.8
-
doubles
public DoubleStream doubles(long streamSize, double randomNumberOrigin, double randomNumberBound)
返回产生给定streamSize
个伪随机数double
值的流,每个值符合给定原点(包括)和绑定(不包括)。生成伪随机数
double
值,就好像它是使用origin和bound调用以下方法的结果: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; }
- 参数
-
streamSize
- 要生成的值的数量 -
randomNumberOrigin
- 每个随机值的原点(包括) -
randomNumberBound
- 每个随机值的绑定(不包括) - 结果
-
伪随机
double
流double
,每个值都有给定的原点(包括)和绑定(不包括) - 异常
-
IllegalArgumentException
- 如果streamSize
小于零 -
IllegalArgumentException
- 如果randomNumberOrigin
大于或等于randomNumberBound
- 从以下版本开始:
- 1.8
-
doubles
public DoubleStream doubles(double randomNumberOrigin, double randomNumberBound)
返回有效无限的伪随机double
流double
,每个值都符合给定的原点(包括)和绑定(不包括)。生成伪随机数
double
值,就好像它是使用origin和bound调用以下方法的结果: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; }
- Implementation Note:
-
实现此方法等同于
doubles(Long.MAX_VALUE, randomNumberOrigin, randomNumberBound)
。 - 参数
-
randomNumberOrigin
- 每个随机值的原点(包括) -
randomNumberBound
- 每个随机值的边界(不包括) - 结果
-
伪随机
double
值的流,每个值具有给定的原点(包括)和绑定(不包括) - 异常
-
IllegalArgumentException
- 如果randomNumberOrigin
大于或等于randomNumberBound
- 从以下版本开始:
- 1.8
-
-