375 |
|
* may, and typically does, vary across program invocations. |
376 |
|
*/ |
377 |
|
public SplittableRandom() { // emulate defaultGen.split() |
378 |
< |
long s = defaultGen.getAndAdd(2 * GOLDEN_GAMMA); |
378 |
> |
long s = defaultGen.getAndAdd(GOLDEN_GAMMA << 1); |
379 |
|
this.seed = mix64(s); |
380 |
|
this.gamma = mixGamma(s + GOLDEN_GAMMA); |
381 |
|
} |
399 |
|
} |
400 |
|
|
401 |
|
/** |
402 |
+ |
* Fills a user-supplied byte array with generated pseudorandom bytes. |
403 |
+ |
* |
404 |
+ |
* @param bytes the byte array to fill with pseudorandom bytes |
405 |
+ |
* @throws NullPointerException if bytes is null |
406 |
+ |
* @since 10 |
407 |
+ |
*/ |
408 |
+ |
public void nextBytes(byte[] bytes) { |
409 |
+ |
int i = 0; |
410 |
+ |
int len = bytes.length; |
411 |
+ |
for (int words = len >> 3; words--> 0; ) { |
412 |
+ |
long rnd = nextLong(); |
413 |
+ |
for (int n = 8; n--> 0; rnd >>>= Byte.SIZE) |
414 |
+ |
bytes[i++] = (byte)rnd; |
415 |
+ |
} |
416 |
+ |
if (i < len) |
417 |
+ |
for (long rnd = nextLong(); i < len; rnd >>>= Byte.SIZE) |
418 |
+ |
bytes[i++] = (byte)rnd; |
419 |
+ |
} |
420 |
+ |
|
421 |
+ |
/** |
422 |
|
* Returns a pseudorandom {@code int} value. |
423 |
|
* |
424 |
|
* @return a pseudorandom {@code int} value |
551 |
|
} |
552 |
|
|
553 |
|
/** |
534 |
– |
* Generates a pseudorandom number with the indicated number of |
535 |
– |
* bits. Unlike in superclass {@link Random}, this method is never |
536 |
– |
* internally called or used by any other publicly accessible |
537 |
– |
* method. |
538 |
– |
* |
539 |
– |
* @param bits random bits |
540 |
– |
* @return the next pseudorandom value from this random number |
541 |
– |
* generator's sequence |
542 |
– |
*/ |
543 |
– |
protected int next(int bits) { |
544 |
– |
return (int)(nextLong() >>> (64 - bits)); |
545 |
– |
} |
546 |
– |
|
547 |
– |
/** |
554 |
|
* Returns a pseudorandom {@code double} value between the specified |
555 |
|
* origin (inclusive) and bound (exclusive). |
556 |
|
* |
799 |
|
* @return a stream of pseudorandom {@code double} values, |
800 |
|
* each with the given origin (inclusive) and bound (exclusive) |
801 |
|
* @throws IllegalArgumentException if {@code streamSize} is |
802 |
< |
* less than zero |
797 |
< |
* @throws IllegalArgumentException if {@code randomNumberOrigin} |
802 |
> |
* less than zero, or {@code randomNumberOrigin} |
803 |
|
* is greater than or equal to {@code randomNumberBound} |
804 |
|
*/ |
805 |
|
public DoubleStream doubles(long streamSize, double randomNumberOrigin, |