author | jlaskey |
Thu, 27 Jun 2019 18:30:27 -0300 | |
branch | JDK-8193209-branch |
changeset 57437 | f02ffcb61dce |
parent 57436 | b0c958c0e6c6 |
permissions | -rw-r--r-- |
57388 | 1 |
/* |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
2 |
* Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. |
57388 | 3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 |
* |
|
5 |
* This code is free software; you can redistribute it and/or modify it |
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
|
7 |
* published by the Free Software Foundation. Oracle designates this |
|
8 |
* particular file as subject to the "Classpath" exception as provided |
|
9 |
* by Oracle in the LICENSE file that accompanied this code. |
|
10 |
* |
|
11 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
|
12 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
13 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
14 |
* version 2 for more details (a copy is included in the LICENSE file that |
|
15 |
* accompanied this code). |
|
16 |
* |
|
17 |
* You should have received a copy of the GNU General Public License version |
|
18 |
* 2 along with this work; if not, write to the Free Software Foundation, |
|
19 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
20 |
* |
|
21 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
22 |
* or visit www.oracle.com if you need additional information or have any |
|
23 |
* questions. |
|
24 |
*/ |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
25 |
|
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
26 |
package java.util.random; |
57388 | 27 |
|
28 |
import java.util.Spliterator; |
|
29 |
import java.util.function.Consumer; |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
30 |
import java.util.function.DoubleConsumer; |
57388 | 31 |
import java.util.function.IntConsumer; |
32 |
import java.util.function.LongConsumer; |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
33 |
import java.util.stream.Stream; |
57388 | 34 |
import java.util.stream.StreamSupport; |
35 |
||
36 |
/** |
|
37 |
* This class provides much of the implementation of the |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
38 |
* {@link ArbitrarilyJumpableRNG} interface, to minimize the effort |
57388 | 39 |
* required to implement that interface. |
40 |
* |
|
41 |
* To implement a pseudorandom number generator, the programmer needs |
|
42 |
* only to extend this class and provide implementations for the |
|
43 |
* methods {@code nextInt()}, {@code nextLong()}, {@code copy()}, |
|
44 |
* {@code jump(distance)}, {@code jumpPowerOfTwo(distance)}, |
|
45 |
* {@code defaultJumpDistance()}, and {@code defaultLeapDistance()}. |
|
46 |
* |
|
47 |
* (If the pseudorandom number generator also has the ability to split, |
|
48 |
* then the programmer may wish to consider instead extending |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
49 |
* {@link AbstractSplittableRNG}.) |
57388 | 50 |
* |
51 |
* The programmer should generally provide at least three constructors: |
|
52 |
* one that takes no arguments, one that accepts a {@code long} |
|
53 |
* seed value, and one that accepts an array of seed {@code byte} values. |
|
54 |
* This class provides a public {@code initialSeed()} method that may |
|
55 |
* be useful in initializing some static state from which to derive |
|
56 |
* defaults seeds for use by the no-argument constructor. |
|
57 |
* |
|
58 |
* For the stream methods (such as {@code ints()} and {@code splits()}), |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
59 |
* this class provides {@link Spliterator}-based implementations that |
57388 | 60 |
* allow parallel execution when appropriate. In this respect |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
61 |
* {@link ArbitrarilyJumpableRNG} differs from {@link JumpableRNG}, |
57388 | 62 |
* which provides very simple implementations that produce |
63 |
* sequential streams only. |
|
64 |
* |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
65 |
* <p>An implementation of the {@link AbstractArbitrarilyJumpableRNG} class |
57388 | 66 |
* must provide concrete definitions for the methods {@code nextInt()}, |
67 |
* {@code nextLong}, {@code period()}, {@code copy()}, {@code jump(double)}, |
|
68 |
* {@code defaultJumpDistance()}, and {@code defaultLeapDistance()}. |
|
69 |
* Default implementations are provided for all other methods. |
|
70 |
* |
|
71 |
* The documentation for each non-abstract method in this class |
|
72 |
* describes its implementation in detail. Each of these methods may |
|
73 |
* be overridden if the pseudorandom number generator being |
|
74 |
* implemented admits a more efficient implementation. |
|
75 |
* |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
76 |
* @since 14 |
57388 | 77 |
*/ |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
78 |
public abstract class AbstractArbitrarilyJumpableRNG |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
79 |
extends AbstractSpliteratorRNG implements ArbitrarilyJumpableRNG { |
57388 | 80 |
|
81 |
/* |
|
82 |
* Implementation Overview. |
|
83 |
* |
|
84 |
* This class provides most of the "user API" methods needed to satisfy |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
85 |
* the interface ArbitrarilyJumpableRNG. Most of these methods |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
86 |
* are in turn inherited from AbstractRNG and the non-public class |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
87 |
* AbstractSpliteratorRNG; this file implements four versions of the |
57388 | 88 |
* jumps method and defines the spliterators necessary to support them. |
89 |
* |
|
90 |
* File organization: First the non-public methods needed by the class |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
91 |
* AbstractSpliteratorRNG, then the main public methods, followed by some |
57388 | 92 |
* custom spliterator classes needed for stream methods. |
93 |
*/ |
|
94 |
||
95 |
// IllegalArgumentException messages |
|
96 |
static final String BadLogDistance = "logDistance must be non-negative"; |
|
97 |
||
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
98 |
// Methods required by class AbstractSpliteratorRNG |
57388 | 99 |
Spliterator.OfInt makeIntsSpliterator(long index, long fence, int origin, int bound) { |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
100 |
return new RandomIntsSpliterator(this, index, fence, origin, bound); |
57388 | 101 |
} |
102 |
Spliterator.OfLong makeLongsSpliterator(long index, long fence, long origin, long bound) { |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
103 |
return new RandomLongsSpliterator(this, index, fence, origin, bound); |
57388 | 104 |
} |
105 |
Spliterator.OfDouble makeDoublesSpliterator(long index, long fence, double origin, double bound) { |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
106 |
return new RandomDoublesSpliterator(this, index, fence, origin, bound); |
57388 | 107 |
} |
108 |
||
109 |
// Similar methods used by this class |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
110 |
Spliterator<RandomNumberGenerator> makeJumpsSpliterator(long index, long fence, double distance) { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
111 |
return new RandomJumpsSpliterator(this, index, fence, distance); |
57388 | 112 |
} |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
113 |
Spliterator<JumpableRNG> makeLeapsSpliterator(long index, long fence, double distance) { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
114 |
return new RandomLeapsSpliterator(this, index, fence, distance); |
57388 | 115 |
} |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
116 |
Spliterator<ArbitrarilyJumpableRNG> makeArbitraryJumpsSpliterator(long index, long fence, double distance) { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
117 |
return new RandomArbitraryJumpsSpliterator(this, index, fence, distance); |
57388 | 118 |
} |
119 |
||
120 |
/* ---------------- public methods ---------------- */ |
|
121 |
||
122 |
/** |
|
123 |
* Returns a new generator whose internal state is an exact copy |
|
124 |
* of this generator (therefore their future behavior should be |
|
125 |
* identical if subjected to the same series of operations). |
|
126 |
* |
|
127 |
* @return a new object that is a copy of this generator |
|
128 |
*/ |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
129 |
public abstract AbstractArbitrarilyJumpableRNG copy(); |
57388 | 130 |
|
131 |
// Stream methods for jumping |
|
132 |
||
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
133 |
private static <T> Stream<T> stream(Spliterator<T> srng) { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
134 |
return StreamSupport.stream(srng, false); |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
135 |
} |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
136 |
|
57388 | 137 |
/** |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
138 |
* Returns an effectively unlimited stream of new pseudorandom number generators, each of which |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
139 |
* implements the {@link RandomNumberGenerator} interface, produced by jumping copies of this |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
140 |
* generator by different integer multiples of the default jump distance. |
57388 | 141 |
* |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
142 |
* @return a stream of objects that implement the {@link RandomNumberGenerator} interface |
57388 | 143 |
* |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
144 |
* @implNote This method is implemented to be equivalent to {@code |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
145 |
* jumps(Long.MAX_VALUE)}. |
57388 | 146 |
*/ |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
147 |
public Stream<RandomNumberGenerator> jumps() { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
148 |
return stream(makeJumpsSpliterator(0L, Long.MAX_VALUE, defaultJumpDistance())); |
57388 | 149 |
} |
150 |
||
151 |
/** |
|
152 |
* Returns a stream producing the given {@code streamSize} number of |
|
153 |
* new pseudorandom number generators, each of which implements the |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
154 |
* {@link RandomNumberGenerator} interface, produced by jumping copies of this generator |
57388 | 155 |
* by different integer multiples of the default jump distance. |
156 |
* |
|
157 |
* @param streamSize the number of generators to generate |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
158 |
* |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
159 |
* @return a stream of objects that implement the {@link RandomNumberGenerator} interface |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
160 |
* |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
161 |
* @throws IllegalArgumentException if {@code streamSize} is less than zero |
57388 | 162 |
*/ |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
163 |
public Stream<RandomNumberGenerator> jumps(long streamSize) { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
164 |
RNGSupport.checkStreamSize(streamSize); |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
165 |
return stream(makeJumpsSpliterator(0L, streamSize, defaultJumpDistance())); |
57388 | 166 |
} |
167 |
||
168 |
/** |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
169 |
* Returns an effectively unlimited stream of new pseudorandom number generators, each of which |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
170 |
* implements the {@link RandomNumberGenerator} interface, produced by jumping copies of this |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
171 |
* generator by different integer multiples of the specified jump distance. |
57388 | 172 |
* |
173 |
* @param distance a distance to jump forward within the state cycle |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
174 |
* |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
175 |
* @return a stream of objects that implement the {@link RandomNumberGenerator} interface |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
176 |
* |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
177 |
* @implNote This method is implemented to be equivalent to {@code |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
178 |
* jumps(Long.MAX_VALUE)}. |
57388 | 179 |
*/ |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
180 |
public Stream<ArbitrarilyJumpableRNG> jumps(double distance) { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
181 |
return stream(makeArbitraryJumpsSpliterator(0L, Long.MAX_VALUE, distance)); |
57388 | 182 |
} |
183 |
||
184 |
/** |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
185 |
* Returns a stream producing the given {@code streamSize} number of new pseudorandom number |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
186 |
* generators, each of which implements the {@link RandomNumberGenerator} interface, produced by |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
187 |
* jumping copies of this generator by different integer multiples of the specified jump |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
188 |
* distance. |
57388 | 189 |
* |
190 |
* @param streamSize the number of generators to generate |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
191 |
* @param distance a distance to jump forward within the state cycle |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
192 |
* |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
193 |
* @return a stream of objects that implement the {@link RandomNumberGenerator} interface |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
194 |
* |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
195 |
* @throws IllegalArgumentException if {@code streamSize} is less than zero |
57388 | 196 |
*/ |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
197 |
public Stream<ArbitrarilyJumpableRNG> jumps(long streamSize, double distance) { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
198 |
RNGSupport.checkStreamSize(streamSize); |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
199 |
return stream(makeArbitraryJumpsSpliterator(0L, streamSize, distance)); |
57388 | 200 |
} |
201 |
||
202 |
/** |
|
203 |
* Alter the state of this pseudorandom number generator so as to |
|
204 |
* jump forward a very large, fixed distance (typically 2<sup>128</sup> |
|
205 |
* or more) within its state cycle. The distance used is that |
|
206 |
* returned by method {@code defaultLeapDistance()}. |
|
207 |
*/ |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
208 |
public void leap() { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
209 |
jump(defaultLeapDistance()); |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
210 |
} |
57388 | 211 |
|
212 |
// Stream methods for leaping |
|
213 |
||
214 |
/** |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
215 |
* Returns an effectively unlimited stream of new pseudorandom number generators, each of which |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
216 |
* implements the {@link RandomNumberGenerator} interface, produced by jumping copies of this |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
217 |
* generator by different integer multiples of the default leap distance. |
57388 | 218 |
* |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
219 |
* @implNote This method is implemented to be equivalent to {@code leaps(Long.MAX_VALUE)}. |
57388 | 220 |
* |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
221 |
* @return a stream of objects that implement the {@link RandomNumberGenerator} interface |
57388 | 222 |
*/ |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
223 |
public Stream<JumpableRNG> leaps() { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
224 |
return stream(makeLeapsSpliterator(0L, Long.MAX_VALUE, defaultLeapDistance())); |
57388 | 225 |
} |
226 |
||
227 |
/** |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
228 |
* Returns a stream producing the given {@code streamSize} number of new pseudorandom number |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
229 |
* generators, each of which implements the {@link RandomNumberGenerator} interface, produced by |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
230 |
* jumping copies of this generator by different integer multiples of the default leap |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
231 |
* distance. |
57388 | 232 |
* |
233 |
* @param streamSize the number of generators to generate |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
234 |
* |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
235 |
* @return a stream of objects that implement the {@link RandomNumberGenerator} interface |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
236 |
* |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
237 |
* @throws IllegalArgumentException if {@code streamSize} is less than zero |
57388 | 238 |
*/ |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
239 |
public Stream<JumpableRNG> leaps(long streamSize) { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
240 |
return stream(makeLeapsSpliterator(0L, streamSize, defaultLeapDistance())); |
57388 | 241 |
} |
242 |
||
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
243 |
|
57388 | 244 |
/** |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
245 |
* Spliterator for int streams. We multiplex the four int versions into one class by treating a |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
246 |
* bound less than origin as unbounded, and also by treating "infinite" as equivalent to |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
247 |
* {@code Long.MAX_VALUE}. For splits, we choose to override the method {@code trySplit()} to |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
248 |
* try to optimize execution speed: instead of dividing a range in half, it breaks off the |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
249 |
* largest possible chunk whose size is a power of two such that the remaining chunk is not |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
250 |
* empty. In this way, the necessary jump distances will tend to be powers of two. The long |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
251 |
* and double versions of this class are identical except for types. |
57388 | 252 |
*/ |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
253 |
static class RandomIntsSpliterator extends RNGSupport.RandomSpliterator implements Spliterator.OfInt { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
254 |
final ArbitrarilyJumpableRNG generatingRNG; |
57388 | 255 |
final int origin; |
256 |
final int bound; |
|
257 |
||
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
258 |
RandomIntsSpliterator(ArbitrarilyJumpableRNG generatingRNG, long index, long fence, int origin, int bound) { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
259 |
super(index, fence); |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
260 |
this.origin = origin; this.bound = bound; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
261 |
this.generatingRNG = generatingRNG; |
57388 | 262 |
} |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
263 |
|
57388 | 264 |
public Spliterator.OfInt trySplit() { |
265 |
long i = index, delta = Long.highestOneBit((fence - i) - 1), m = i + delta; |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
266 |
if (m <= i) return null; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
267 |
index = m; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
268 |
ArbitrarilyJumpableRNG r = generatingRNG; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
269 |
return new RandomIntsSpliterator(r.copyAndJump((double)delta), i, m, origin, bound); |
57388 | 270 |
} |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
271 |
|
57388 | 272 |
public boolean tryAdvance(IntConsumer consumer) { |
273 |
if (consumer == null) throw new NullPointerException(); |
|
274 |
long i = index, f = fence; |
|
275 |
if (i < f) { |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
276 |
consumer.accept(RNGSupport.boundedNextInt(generatingRNG, origin, bound)); |
57388 | 277 |
index = i + 1; |
278 |
return true; |
|
279 |
} |
|
280 |
else return false; |
|
281 |
} |
|
282 |
||
283 |
public void forEachRemaining(IntConsumer consumer) { |
|
284 |
if (consumer == null) throw new NullPointerException(); |
|
285 |
long i = index, f = fence; |
|
286 |
if (i < f) { |
|
287 |
index = f; |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
288 |
ArbitrarilyJumpableRNG r = generatingRNG; |
57388 | 289 |
int o = origin, b = bound; |
290 |
do { |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
291 |
consumer.accept(RNGSupport.boundedNextInt(r, o, b)); |
57388 | 292 |
} while (++i < f); |
293 |
} |
|
294 |
} |
|
295 |
} |
|
296 |
||
297 |
/** |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
298 |
* Spliterator for long streams. |
57388 | 299 |
*/ |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
300 |
static class RandomLongsSpliterator extends RNGSupport.RandomSpliterator implements Spliterator.OfLong { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
301 |
final ArbitrarilyJumpableRNG generatingRNG; |
57388 | 302 |
final long origin; |
303 |
final long bound; |
|
304 |
||
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
305 |
RandomLongsSpliterator(ArbitrarilyJumpableRNG generatingRNG, long index, long fence, long origin, long bound) { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
306 |
super(index, fence); |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
307 |
this.generatingRNG = generatingRNG; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
308 |
this.origin = origin; this.bound = bound; |
57388 | 309 |
} |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
310 |
|
57388 | 311 |
public Spliterator.OfLong trySplit() { |
312 |
long i = index, delta = Long.highestOneBit((fence - i) - 1), m = i + delta; |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
313 |
if (m <= i) return null; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
314 |
index = m; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
315 |
ArbitrarilyJumpableRNG r = generatingRNG; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
316 |
return new RandomLongsSpliterator(r.copyAndJump((double)delta), i, m, origin, bound); |
57388 | 317 |
} |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
318 |
|
57388 | 319 |
public boolean tryAdvance(LongConsumer consumer) { |
320 |
if (consumer == null) throw new NullPointerException(); |
|
321 |
long i = index, f = fence; |
|
322 |
if (i < f) { |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
323 |
consumer.accept(RNGSupport.boundedNextLong(generatingRNG, origin, bound)); |
57388 | 324 |
index = i + 1; |
325 |
return true; |
|
326 |
} |
|
327 |
else return false; |
|
328 |
} |
|
329 |
||
330 |
public void forEachRemaining(LongConsumer consumer) { |
|
331 |
if (consumer == null) throw new NullPointerException(); |
|
332 |
long i = index, f = fence; |
|
333 |
if (i < f) { |
|
334 |
index = f; |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
335 |
ArbitrarilyJumpableRNG r = generatingRNG; |
57388 | 336 |
long o = origin, b = bound; |
337 |
do { |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
338 |
consumer.accept(RNGSupport.boundedNextLong(r, o, b)); |
57388 | 339 |
} while (++i < f); |
340 |
} |
|
341 |
} |
|
342 |
} |
|
343 |
||
344 |
/** |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
345 |
* Spliterator for double streams. |
57388 | 346 |
*/ |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
347 |
static class RandomDoublesSpliterator extends RNGSupport.RandomSpliterator implements Spliterator.OfDouble { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
348 |
final ArbitrarilyJumpableRNG generatingRNG; |
57388 | 349 |
final double origin; |
350 |
final double bound; |
|
351 |
||
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
352 |
RandomDoublesSpliterator(ArbitrarilyJumpableRNG generatingRNG, long index, long fence, double origin, double bound) { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
353 |
super(index, fence); |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
354 |
this.generatingRNG = generatingRNG; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
355 |
this.origin = origin; this.bound = bound; |
57388 | 356 |
} |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
357 |
|
57388 | 358 |
public Spliterator.OfDouble trySplit() { |
359 |
||
360 |
long i = index, delta = Long.highestOneBit((fence - i) - 1), m = i + delta; |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
361 |
if (m <= i) return null; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
362 |
index = m; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
363 |
ArbitrarilyJumpableRNG r = generatingRNG; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
364 |
return new RandomDoublesSpliterator(r.copyAndJump((double)delta), i, m, origin, bound); |
57388 | 365 |
} |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
366 |
|
57388 | 367 |
public boolean tryAdvance(DoubleConsumer consumer) { |
368 |
if (consumer == null) throw new NullPointerException(); |
|
369 |
long i = index, f = fence; |
|
370 |
if (i < f) { |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
371 |
consumer.accept(RNGSupport.boundedNextDouble(generatingRNG, origin, bound)); |
57388 | 372 |
index = i + 1; |
373 |
return true; |
|
374 |
} |
|
375 |
else return false; |
|
376 |
} |
|
377 |
||
378 |
public void forEachRemaining(DoubleConsumer consumer) { |
|
379 |
if (consumer == null) throw new NullPointerException(); |
|
380 |
long i = index, f = fence; |
|
381 |
if (i < f) { |
|
382 |
index = f; |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
383 |
ArbitrarilyJumpableRNG r = generatingRNG; |
57388 | 384 |
double o = origin, b = bound; |
385 |
do { |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
386 |
consumer.accept(RNGSupport.boundedNextDouble(r, o, b)); |
57388 | 387 |
} while (++i < f); |
388 |
} |
|
389 |
} |
|
390 |
} |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
391 |
|
57388 | 392 |
// Spliterators for producing new generators by jumping or leaping. The |
393 |
// complete implementation of each of these spliterators is right here. |
|
394 |
// In the same manner as for the preceding spliterators, the method trySplit() is |
|
395 |
// coded to optimize execution speed: instead of dividing a range |
|
396 |
// in half, it breaks off the largest possible chunk whose |
|
397 |
// size is a power of two such that the remaining chunk is not |
|
398 |
// empty. In this way, the necessary jump distances will tend to be |
|
399 |
// powers of two. |
|
400 |
||
401 |
/** |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
402 |
* Spliterator for stream of generators of type RandomNumberGenerator produced by jumps. |
57388 | 403 |
*/ |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
404 |
static class RandomJumpsSpliterator extends RNGSupport.RandomSpliterator implements Spliterator<RandomNumberGenerator> { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
405 |
ArbitrarilyJumpableRNG generatingRNG; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
406 |
final double distance; |
57388 | 407 |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
408 |
RandomJumpsSpliterator(ArbitrarilyJumpableRNG generatingRNG, long index, long fence, double distance) { |
57388 | 409 |
super(index, fence); |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
410 |
this.generatingRNG = generatingRNG; this.distance = distance; |
57388 | 411 |
} |
412 |
||
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
413 |
public Spliterator<RandomNumberGenerator> trySplit() { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
414 |
long i = index, delta = Long.highestOneBit((fence - i) - 1), m = i + delta; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
415 |
if (m <= i) return null; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
416 |
index = m; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
417 |
ArbitrarilyJumpableRNG r = generatingRNG; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
418 |
// Because delta is a power of two, (distance * (double)delta) can always be computed exactly. |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
419 |
return new RandomJumpsSpliterator(r.copyAndJump(distance * (double)delta), i, m, distance); |
57388 | 420 |
} |
421 |
||
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
422 |
public boolean tryAdvance(Consumer<? super RandomNumberGenerator> consumer) { |
57388 | 423 |
if (consumer == null) throw new NullPointerException(); |
424 |
long i = index, f = fence; |
|
425 |
if (i < f) { |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
426 |
consumer.accept(generatingRNG.copyAndJump(distance)); |
57388 | 427 |
index = i + 1; |
428 |
return true; |
|
429 |
} |
|
430 |
return false; |
|
431 |
} |
|
432 |
||
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
433 |
public void forEachRemaining(Consumer<? super RandomNumberGenerator> consumer) { |
57388 | 434 |
if (consumer == null) throw new NullPointerException(); |
435 |
long i = index, f = fence; |
|
436 |
if (i < f) { |
|
437 |
index = f; |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
438 |
ArbitrarilyJumpableRNG r = generatingRNG; |
57388 | 439 |
do { |
440 |
consumer.accept(r.copyAndJump(distance)); |
|
441 |
} while (++i < f); |
|
442 |
} |
|
443 |
} |
|
444 |
} |
|
445 |
||
446 |
/** |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
447 |
* Spliterator for stream of generators of type RandomNumberGenerator produced by leaps. |
57388 | 448 |
*/ |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
449 |
static class RandomLeapsSpliterator extends RNGSupport.RandomSpliterator implements Spliterator<JumpableRNG> { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
450 |
ArbitrarilyJumpableRNG generatingRNG; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
451 |
final double distance; |
57388 | 452 |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
453 |
RandomLeapsSpliterator(ArbitrarilyJumpableRNG generatingRNG, long index, long fence, double distance) { |
57388 | 454 |
super(index, fence); |
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
455 |
this.generatingRNG = generatingRNG; this.distance = distance; |
57388 | 456 |
} |
457 |
||
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
458 |
public Spliterator<JumpableRNG> trySplit() { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
459 |
long i = index, delta = Long.highestOneBit((fence - i) - 1), m = i + delta; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
460 |
if (m <= i) return null; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
461 |
index = m; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
462 |
// Because delta is a power of two, (distance * (double)delta) can always be computed exactly. |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
463 |
return new RandomLeapsSpliterator(generatingRNG.copyAndJump(distance * (double)delta), i, m, distance); |
57388 | 464 |
} |
465 |
||
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
466 |
public boolean tryAdvance(Consumer<? super JumpableRNG> consumer) { |
57388 | 467 |
if (consumer == null) throw new NullPointerException(); |
468 |
long i = index, f = fence; |
|
469 |
if (i < f) { |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
470 |
consumer.accept(generatingRNG.copyAndJump(distance)); |
57388 | 471 |
index = i + 1; |
472 |
return true; |
|
473 |
} |
|
474 |
return false; |
|
475 |
} |
|
476 |
||
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
477 |
public void forEachRemaining(Consumer<? super JumpableRNG> consumer) { |
57388 | 478 |
if (consumer == null) throw new NullPointerException(); |
479 |
long i = index, f = fence; |
|
480 |
if (i < f) { |
|
481 |
index = f; |
|
57437
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
482 |
ArbitrarilyJumpableRNG r = generatingRNG; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
483 |
do { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
484 |
consumer.accept(r.copyAndJump(distance)); |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
485 |
} while (++i < f); |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
486 |
} |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
487 |
} |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
488 |
} |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
489 |
|
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
490 |
/** |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
491 |
* Spliterator for stream of generators of type RandomNumberGenerator produced by arbitrary jumps. |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
492 |
*/ |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
493 |
static class RandomArbitraryJumpsSpliterator extends RNGSupport.RandomSpliterator implements Spliterator<ArbitrarilyJumpableRNG> { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
494 |
ArbitrarilyJumpableRNG generatingRNG; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
495 |
final double distance; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
496 |
|
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
497 |
RandomArbitraryJumpsSpliterator(ArbitrarilyJumpableRNG generatingRNG, long index, long fence, double distance) { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
498 |
super(index, fence); |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
499 |
this.generatingRNG = generatingRNG; this.distance = distance; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
500 |
} |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
501 |
|
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
502 |
public Spliterator<ArbitrarilyJumpableRNG> trySplit() { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
503 |
long i = index, delta = Long.highestOneBit((fence - i) - 1), m = i + delta; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
504 |
if (m <= i) return null; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
505 |
index = m; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
506 |
// Because delta is a power of two, (distance * (double)delta) can always be computed exactly. |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
507 |
return new RandomArbitraryJumpsSpliterator(generatingRNG.copyAndJump(distance * (double)delta), i, m, distance); |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
508 |
} |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
509 |
|
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
510 |
public boolean tryAdvance(Consumer<? super ArbitrarilyJumpableRNG> consumer) { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
511 |
if (consumer == null) throw new NullPointerException(); |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
512 |
long i = index, f = fence; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
513 |
if (i < f) { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
514 |
consumer.accept(generatingRNG.copyAndJump(distance)); |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
515 |
index = i + 1; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
516 |
return true; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
517 |
} |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
518 |
return false; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
519 |
} |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
520 |
|
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
521 |
public void forEachRemaining(Consumer<? super ArbitrarilyJumpableRNG> consumer) { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
522 |
if (consumer == null) throw new NullPointerException(); |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
523 |
long i = index, f = fence; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
524 |
if (i < f) { |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
525 |
index = f; |
f02ffcb61dce
Rename Rng.java to RandomNumberGenerator.java, clean up javadoc and misc code changes
jlaskey
parents:
57436
diff
changeset
|
526 |
ArbitrarilyJumpableRNG r = generatingRNG; |
57388 | 527 |
do { |
528 |
consumer.accept(r.copyAndJump(distance)); |
|
529 |
} while (++i < f); |
|
530 |
} |
|
531 |
} |
|
532 |
} |
|
533 |
||
534 |
} |