Save the date! Android Dev Summit is coming to Mountain View, CA on November 7-8, 2018.

ThreadLocalRandom

public class ThreadLocalRandom
extends Random

java.lang.Object
   ↳ java.util.Random
     ↳ java.util.concurrent.ThreadLocalRandom


A random number generator isolated to the current thread. Like the global Random generator used by the Math class, a ThreadLocalRandom is initialized with an internally generated seed that may not otherwise be modified. When applicable, use of ThreadLocalRandom rather than shared Random objects in concurrent programs will typically encounter much less overhead and contention. Use of ThreadLocalRandom is particularly appropriate when multiple tasks (for example, each a ForkJoinTask) use random numbers in parallel in thread pools.

Usages of this class should typically be of the form: ThreadLocalRandom.current().nextX(...) (where X is Int, Long, etc). When all usages are of this form, it is never possible to accidently share a ThreadLocalRandom across multiple threads.

This class also provides additional commonly used bounded random generation methods.

Instances of ThreadLocalRandom are not cryptographically secure. Consider instead using SecureRandom in security-sensitive applications. Additionally, default-constructed instances do not use a cryptographically random seed unless the system property java.util.secureRandomSeed is set to true.

Summary

Public methods

static ThreadLocalRandom current()

Returns the current thread's ThreadLocalRandom.

DoubleStream doubles(long streamSize, double randomNumberOrigin, double randomNumberBound)

Returns a stream producing the given streamSize number of pseudorandom double values, each conforming to the given origin (inclusive) and bound (exclusive).

DoubleStream doubles(long streamSize)

Returns a stream producing the given streamSize number of pseudorandom double values, each between zero (inclusive) and one (exclusive).

DoubleStream doubles()

Returns an effectively unlimited stream of pseudorandom double values, each between zero (inclusive) and one (exclusive).

DoubleStream doubles(double randomNumberOrigin, double randomNumberBound)

Returns an effectively unlimited stream of pseudorandom double values, each conforming to the given origin (inclusive) and bound (exclusive).

IntStream ints(long streamSize)

Returns a stream producing the given streamSize number of pseudorandom int values.

IntStream ints(int randomNumberOrigin, int randomNumberBound)

Returns an effectively unlimited stream of pseudorandom int values, each conforming to the given origin (inclusive) and bound (exclusive).

IntStream ints()

Returns an effectively unlimited stream of pseudorandom int values.

IntStream ints(long streamSize, int randomNumberOrigin, int randomNumberBound)

Returns a stream producing the given streamSize number of pseudorandom int values, each conforming to the given origin (inclusive) and bound (exclusive).

LongStream longs(long streamSize)

Returns a stream producing the given streamSize number of pseudorandom long values.

LongStream longs()

Returns an effectively unlimited stream of pseudorandom long values.

LongStream longs(long randomNumberOrigin, long randomNumberBound)

Returns an effectively unlimited stream of pseudorandom long values, each conforming to the given origin (inclusive) and bound (exclusive).

LongStream longs(long streamSize, long randomNumberOrigin, long randomNumberBound)

Returns a stream producing the given streamSize number of pseudorandom long, each conforming to the given origin (inclusive) and bound (exclusive).

boolean nextBoolean()

Returns a pseudorandom boolean value.

double nextDouble()

Returns a pseudorandom double value between zero (inclusive) and one (exclusive).

double nextDouble(double bound)

Returns a pseudorandom double value between 0.0 (inclusive) and the specified bound (exclusive).

double nextDouble(double origin, double bound)

Returns a pseudorandom double value between the specified origin (inclusive) and bound (exclusive).

float nextFloat()

Returns a pseudorandom float value between zero (inclusive) and one (exclusive).

double nextGaussian()

Returns 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 origin, int bound)

Returns a pseudorandom int value between the specified origin (inclusive) and the specified bound (exclusive).

int nextInt()

Returns a pseudorandom int value.

int nextInt(int bound)

Returns a pseudorandom int value between zero (inclusive) and the specified bound (exclusive).

long nextLong(long origin, long bound)

Returns a pseudorandom long value between the specified origin (inclusive) and the specified bound (exclusive).

long nextLong(long bound)

Returns a pseudorandom long value between zero (inclusive) and the specified bound (exclusive).

long nextLong()

Returns a pseudorandom long value.

void setSeed(long seed)

Throws UnsupportedOperationException.

Protected methods

int next(int bits)

Generates the next pseudorandom number.

Inherited methods

Public methods

current

added in API level 21
public static ThreadLocalRandom current ()

Returns the current thread's ThreadLocalRandom.

Returns
ThreadLocalRandom the current thread's ThreadLocalRandom

doubles

added in API level 24
public DoubleStream doubles (long streamSize, 
                double randomNumberOrigin, 
                double randomNumberBound)

Returns a stream producing the given streamSize number of pseudorandom double values, each conforming to the given origin (inclusive) and bound (exclusive).

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

doubles

added in API level 24
public DoubleStream doubles (long streamSize)

Returns a stream producing the given streamSize number of pseudorandom double values, each between zero (inclusive) and one (exclusive).

Parameters
streamSize long: the number of values to generate

Returns
DoubleStream a stream of double values

Throws
IllegalArgumentException if streamSize is less than zero

doubles

added in API level 24
public DoubleStream doubles ()

Returns an effectively unlimited stream of pseudorandom double values, each between zero (inclusive) and one (exclusive).

Implementation Note:
  • This method is implemented to be equivalent to doubles(Long.MAX_VALUE).
Returns
DoubleStream a stream of pseudorandom double values

doubles

added in API level 24
public DoubleStream doubles (double randomNumberOrigin, 
                double randomNumberBound)

Returns an effectively unlimited stream of pseudorandom double values, each conforming to the given origin (inclusive) and bound (exclusive).

Implementation Note:
  • This method is implemented to be equivalent to 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

ints

added in API level 24
public IntStream ints (long streamSize)

Returns a stream producing the given streamSize number of pseudorandom int values.

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

ints

added in API level 24
public IntStream ints (int randomNumberOrigin, 
                int randomNumberBound)

Returns an effectively unlimited stream of pseudorandom int values, each conforming to the given origin (inclusive) and bound (exclusive).

Implementation Note:
  • This method is implemented to be equivalent to 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

ints

added in API level 24
public IntStream ints ()

Returns an effectively unlimited stream of pseudorandom int values.

Implementation Note:
  • This method is implemented to be equivalent to ints(Long.MAX_VALUE).
Returns
IntStream a stream of pseudorandom int values

ints

added in API level 24
public IntStream ints (long streamSize, 
                int randomNumberOrigin, 
                int randomNumberBound)

Returns a stream producing the given streamSize number of pseudorandom int values, each conforming to the given origin (inclusive) and bound (exclusive).

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

longs

added in API level 24
public LongStream longs (long streamSize)

Returns a stream producing the given streamSize number of pseudorandom long values.

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

longs

added in API level 24
public LongStream longs ()

Returns an effectively unlimited stream of pseudorandom long values.

Implementation Note:
  • This method is implemented to be equivalent to longs(Long.MAX_VALUE).
Returns
LongStream a stream of pseudorandom long values

longs

added in API level 24
public LongStream longs (long randomNumberOrigin, 
                long randomNumberBound)

Returns an effectively unlimited stream of pseudorandom long values, each conforming to the given origin (inclusive) and bound (exclusive).

Implementation Note:
  • This method is implemented to be equivalent to 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

longs

added in API level 24
public LongStream longs (long streamSize, 
                long randomNumberOrigin, 
                long randomNumberBound)

Returns a stream producing the given streamSize number of pseudorandom long, each conforming to the given origin (inclusive) and bound (exclusive).

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

nextBoolean

added in API level 21
public boolean nextBoolean ()

Returns a pseudorandom boolean value.

Returns
boolean a pseudorandom boolean value

nextDouble

added in API level 21
public double nextDouble ()

Returns a pseudorandom double value between zero (inclusive) and one (exclusive).

Returns
double a pseudorandom double value between zero (inclusive) and one (exclusive)

nextDouble

added in API level 21
public double nextDouble (double bound)

Returns a pseudorandom double value between 0.0 (inclusive) and the specified bound (exclusive).

Parameters
bound double: the upper bound (exclusive). Must be positive.

Returns
double a pseudorandom double value between zero (inclusive) and the bound (exclusive)

Throws
IllegalArgumentException if bound is not positive

nextDouble

added in API level 21
public double nextDouble (double origin, 
                double bound)

Returns a pseudorandom double value between the specified origin (inclusive) and bound (exclusive).

Parameters
origin double: the least value returned

bound double: the upper bound (exclusive)

Returns
double a pseudorandom double value between the origin (inclusive) and the bound (exclusive)

Throws
IllegalArgumentException if origin is greater than or equal to bound

nextFloat

added in API level 21
public float nextFloat ()

Returns a pseudorandom float value between zero (inclusive) and one (exclusive).

Returns
float a pseudorandom float value between zero (inclusive) and one (exclusive)

nextGaussian

added in API level 21
public double nextGaussian ()

Returns the next pseudorandom, Gaussian ("normally") distributed double value with mean 0.0 and standard deviation 1.0 from this random number generator's sequence.

The general contract of nextGaussian is that one double value, chosen from (approximately) the usual normal distribution with mean 0.0 and standard deviation 1.0, is pseudorandomly generated and returned.

The method nextGaussian is implemented by class Random as if by a threadsafe version of the following:

 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

nextInt

added in API level 21
public int nextInt (int origin, 
                int bound)

Returns a pseudorandom int value between the specified origin (inclusive) and the specified bound (exclusive).

Parameters
origin int: the least value returned

bound int: the upper bound (exclusive)

Returns
int a pseudorandom int value between the origin (inclusive) and the bound (exclusive)

Throws
IllegalArgumentException if origin is greater than or equal to bound

nextInt

added in API level 21
public int nextInt ()

Returns a pseudorandom int value.

Returns
int a pseudorandom int value

nextInt

added in API level 21
public int nextInt (int bound)

Returns a pseudorandom int value between zero (inclusive) and the specified bound (exclusive).

Parameters
bound int: the upper bound (exclusive). Must be positive.

Returns
int a pseudorandom int value between zero (inclusive) and the bound (exclusive)

Throws
IllegalArgumentException if bound is not positive

nextLong

added in API level 21
public long nextLong (long origin, 
                long bound)

Returns a pseudorandom long value between the specified origin (inclusive) and the specified bound (exclusive).

Parameters
origin long: the least value returned

bound long: the upper bound (exclusive)

Returns
long a pseudorandom long value between the origin (inclusive) and the bound (exclusive)

Throws
IllegalArgumentException if origin is greater than or equal to bound

nextLong

added in API level 21
public long nextLong (long bound)

Returns a pseudorandom long value between zero (inclusive) and the specified bound (exclusive).

Parameters
bound long: the upper bound (exclusive). Must be positive.

Returns
long a pseudorandom long value between zero (inclusive) and the bound (exclusive)

Throws
IllegalArgumentException if bound is not positive

nextLong

added in API level 21
public long nextLong ()

Returns a pseudorandom long value.

Returns
long a pseudorandom long value

setSeed

added in API level 21
public void setSeed (long seed)

Throws UnsupportedOperationException. Setting seeds in this generator is not supported.

Parameters
seed long: the initial seed

Throws
UnsupportedOperationException always

Protected methods

next

added in API level 21
protected int next (int bits)

Generates the next pseudorandom number. Subclasses should override this, as this is used by all other methods.

The general contract of next is that it returns an int value and if the argument bits is between 1 and 32 (inclusive), then that many low-order bits of the returned value will be (approximately) independently chosen bit values, each of which is (approximately) equally likely to be 0 or 1. The method next is implemented by class Random by atomically updating the seed to

(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