http://java-performance.info/java-util-random-java-util-concurrent-threadlocalrandom-multithreaded-environments/
How to reuse a Random seed in java so that I nextInt() the same values again?
java.util.Random
java.util.Random
is available from Java 1.0. It is a thread safe class, so you may share (in theory) instances of this class between several threads and do not expect to get the same random data in 2 threads at the same time. Such thread safety is achieved via using an AtomicLong
for the generator seed.Random
uses AtomicLong
CAS (compare-and-set) operations for updating its seed. Despite being a light non-blocking primitive used in a lot of non-blocking algorithms, CAS behaves really poorly under the high contention. Wait for test results to see how poorly it behaves.java.util.concurrent.ThreadLocalRandom
java.util.concurrent.ThreadLocalRandom
was added in Java 7 as an attempt to overcome all performance issues associated with java.util.Random
. This new class extends java.util.Random
, so you may pass it to all logic expecting the old java.util.Random
.
Here are main
ThreadLocalRandom
implementation details:- Internally it does not use an
AtomicLong
seed fromRandom
. Instead it uses an ordinarylong
. - You can not create an instance of
ThreadLocalRandom
yourself, because its constructor is not public. Instead you should use its static factoryThreadLocalRandom.current()
. This factory method queries internalThreadLocal<ThreadLocalRandom>
- It is CPU-cache aware, so it uses 8
long
dummy fields for padding, thus pushing anythingelse out of its 64 byte L1 cache line.
- Do not share an instance of
java.util.Random
between several threads in any circumstances, wrap it inThreadLocal
instead. - From Java 7 prefer
java.util.concurrent.ThreadLocalRandom
tojava.util.Random
in allcircumstances - it is backwards compatible with existing code, but uses cheaper operations internally.
- Java7在所有情形下都更推荐使用java.util.concurrent.ThreadLocalRandom——它向下兼容已有的代码且运营成本更低。
How to reuse a Random seed in java so that I nextInt() the same values again?
Fix the seed, that's it.
Random randomGenerator = new Random(5);
System.out.println(randomGenerator.nextInt(Integer.MAX_VALUE));
randomGenerator = new Random(5);
System.out.println(randomGenerator.nextInt(Integer.MAX_VALUE));
Result :
1568779487
1568779487
http://stackoverflow.com/questions/12458383/java-random-numbers-using-a-seed
If you're giving the same seed, that's normal, that's an important feature allowing tests.
Check this to understand pseudo random generation and seeds :http://en.wikipedia.org/wiki/Pseudorandom_number_generator
A pseudorandom number generator (PRNG), also known as a deterministic random bit generator DRBG, is an algorithm for generating a sequence of numbers that approximates the properties of random numbers. The sequence is not truly random in that it is completely determined by a relatively small set of initial values, called the PRNG's state, which includes a truly random seed.