- java.lang.Object
-
- java.util.Random
-
- All Implemented Interfaces:
-
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
-
-
方法摘要
所有方法 接口方法 具体的方法 Modifier and Type 方法 描述 DoubleStreamdoubles()返回一个有效的无限流的伪随机数double,每个值在零(包括)和一(独占)之间。DoubleStreamdoubles(double randomNumberOrigin, double randomNumberBound)返回一个有效的无限流伪随机数double值,每个符合给定的起始(包括)和绑定(排除)。DoubleStreamdoubles(long streamSize)返回一个流,产生给定的streamSize伪随机数double值,每个值在零(包括)和一(独占)之间。DoubleStreamdoubles(long streamSize, double randomNumberOrigin, double randomNumberBound)返回一个流,产生给定的streamSize数量的伪随机数double值,每个符合给定的起始(包括)和绑定(排他)。IntStreamints()返回一个有效的无限流的伪随机数int值。IntStreamints(int randomNumberOrigin, int randomNumberBound)返回一个有效无限流的伪随机数int值,每个符合给定的起始(包括)和绑定(排除)。IntStreamints(long streamSize)返回产生给定的streamSize数量的伪随机数int值的流。IntStreamints(long streamSize, int randomNumberOrigin, int randomNumberBound)返回一个流,产生给定的streamSize伪随机数int值,每个值符合给定的起始(包括)和绑定(排他)。LongStreamlongs()返回一个有效的无限流的伪随机数long值。LongStreamlongs(long streamSize)返回一个流,产生给定的streamSize伪随机数long值。LongStreamlongs(long randomNumberOrigin, long randomNumberBound)返回一个有效的无限流伪随机数long,每个值都符合给定的起始(包括)和绑定(排他)。LongStreamlongs(long streamSize, long randomNumberOrigin, long randomNumberBound)返回一个流,产生给定的streamSize伪随机数long,每个符合给定的起始(包括)和绑定(排他)。protected intnext(int bits)生成下一个伪随机数。booleannextBoolean()从该随机数生成器的序列返回下一个伪随机数,均匀分布的boolean值。voidnextBytes(byte[] bytes)生成随机字节并将它们放入用户提供的字节数组中。doublenextDouble()返回下一个伪,均匀分布double之间价值0.0和1.0从这个随机数生成器的序列。floatnextFloat()返回下一个伪,均匀分布float之间价值0.0和1.0从这个随机数生成器的序列。doublenextGaussian()从该随机数发生器的序列返回下一个伪随机数,高斯(“正”)分布的double值,平均值为0.0,标准偏差为1.0。intnextInt()从这个随机数生成器的序列返回下一个伪随机数,均匀分布的int值。intnextInt(int bound)返回伪随机的,均匀分布int值介于0(含)和指定值(不包括),从该随机数生成器的序列绘制。longnextLong()返回下一个伪随机数,从这个随机数发生器的序列中均匀分布long值。voidsetSeed(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()。setSeed类的Random恰好只使用给定种子的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)这是由DH Lehmer定义的线性同余伪随机数生成器,由Donald E. Knuth在“计算机编程艺术”第2卷: 半数学算法 ,第3.2.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- 上限(独占)。 必须是积极的。 - 结果
-
下一个伪随机数,从这个随机数发生器的序列中均匀分布在零(包括)和
bound(排他)之间的int值 - 异常
-
IllegalArgumentException- 如果绑定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()
返回下一个伪,均匀分布float之间价值0.0和1.0从这个随机数生成器的序列。的常规协定
nextFloat是一个float值,选择(约)均匀地从范围0.0f(含)至1.0f(不包括),伪随机地生成并返回。 以大致相同的概率产生形式为m× 2 -24 ,其中m是小于2 24的正整数的所有2 24个可能的float值。方法
nextFloat由类Random实现,好像通过如下:public float nextFloat() { return next(24) / ((float)(1 << 24)); }仅在下面的方法仅仅是独立选择的位的无偏差源的情况下,在上述描述中使用了“大约”对冲。 如果它是随机选择位的完美源,则所示的算法将从所述范围中选择
float值,具有完美的均匀性。[在Java的早期版本中,结果错误地计算为:
这可能似乎是等同的,如果不是更好,但实际上它引入了一个轻微的不均匀性,因为浮点数的四舍五入的偏差:有意义的低位比较有可能是0这将是1.]return next(30) / ((float)(1 << 30));- 结果
-
下一个伪均匀分布
float值之间0.0和1.0从该随机数生成器的序列
-
nextDouble
public double nextDouble()
返回下一个伪,均匀分布double之间价值0.0和1.0从这个随机数生成器的序列。的常规协定
nextDouble是一个double值,选择(约)均匀地从范围0.0d(含)至1.0d(不包括),伪随机地生成并返回。方法
nextDouble由类Random实现,如同通过:public double nextDouble() { return (((long)next(26) << 27) + next(27)) / (double)(1L << 53); }仅在
next方法仅仅是独立选择的位的无偏差源时才使用“近似”对冲。 如果它是随机选择位的完美来源,则所示的算法将从所述范围中选择double值,具有完美的均匀性。[在Java的早期版本中,结果错误地计算为:
这可能似乎是等同的,如果不是更好,但事实上它引入了一个大的不均匀性,因为浮点数的四舍五入有偏差:有效数的低位是0的可能性是三倍比那会是1! 这种不均匀性在实践中可能无关紧要,但我们力求完美。]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的一般合同是从(大约)平均值为0.0和标准差1.0的常规正态分布中选出的一个double值被伪随机生成并返回。方法
nextGaussian由类Random实现,好像通过以下的线程安全版本:这使用GEP Box,ME Muller和G. Marsaglia的极性方法 ,如Donald E. Knuth在“计算机编程艺术”第2卷: Seminumerical Algorithms ,第3.4.1节,C节,算法P中所述。请注意它产生两个独立的值,只需一次呼叫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 - 从以下版本开始:
- 1.8
-
ints
public 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; } }- 参数
-
streamSize- 要生成的值的数量 -
randomNumberOrigin- 每个随机值的起点(含) -
randomNumberBound- 每个随机值的绑定(排他) - 结果
-
一系列伪随机数(
int,每个都有给定的来源(包括)和绑定(排他) - 异常
-
IllegalArgumentException- 如果streamSize小于零,或randomNumberOrigin大于或等于randomNumberBound - 从以下版本开始:
- 1.8
-
ints
public 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; } }- Implementation Note:
-
该方法实现相当于
ints(Long.MAX_VALUE, randomNumberOrigin, randomNumberBound)。 - 参数
-
randomNumberOrigin- 每个随机值的起点(含) -
randomNumberBound- 每个随机值的绑定(排他) - 结果
-
一个伪随机流,
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值就像调用方法nextLong()的结果一样 。- Implementation Note:
-
该方法实现为等同于
longs(Long.MAX_VALUE)。 - 结果
-
一串伪随机数
long - 从以下版本开始:
- 1.8
-
longs
public 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; }- 参数
-
streamSize- 要生成的值的数量 -
randomNumberOrigin- 每个随机值的起点(含) -
randomNumberBound- 每个随机值的绑定(排他) - 结果
-
一个伪随机数(
long,每个都有给定的来源(包括)和绑定(排他) - 异常
-
IllegalArgumentException- 如果streamSize小于零,或randomNumberOrigin大于或等于randomNumberBound - 从以下版本开始:
- 1.8
-
longs
public 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; }- 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值被生成,就像它是调用方法nextDouble()的结果一样 。- Implementation Note:
-
该方法实现为等同于
doubles(Long.MAX_VALUE)。 - 结果
-
一串伪随机数
double - 从以下版本开始:
- 1.8
-
doubles
public 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; }- 参数
-
streamSize- 要生成的值的数量 -
randomNumberOrigin- 每个随机值的起点(含) -
randomNumberBound- 每个随机值的绑定(排他) - 结果
-
一个伪随机数(
double,每个都有给定的来源(包括)和绑定(排他) - 异常
-
IllegalArgumentException- 如果streamSize小于零 -
IllegalArgumentException- 如果randomNumberOrigin大于或等于randomNumberBound - 从以下版本开始:
- 1.8
-
doubles
public 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; }- Implementation Note:
-
该方法实现等同于
doubles(Long.MAX_VALUE, randomNumberOrigin, randomNumberBound)。 - 参数
-
randomNumberOrigin- 每个随机值的起始(含) -
randomNumberBound- 每个随机值的绑定(排他) - 结果
-
一系列伪随机数(
double,每个都有给定的来源(包括)和绑定(排他) - 异常
-
IllegalArgumentException- 如果randomNumberOrigin大于或等于randomNumberBound - 从以下版本开始:
- 1.8
-
-