Subtractive generator: Difference between revisions

m (→‎{{header|Sidef}}: minor code simplification)
(→‎{{header|Java}}: added Java)
Line 890:
</lang>
 
=={{header|Java}}==
{{trans|D}}
{{works with|Java|8}}
<lang java>import java.util.function.IntSupplier;
import static java.util.stream.IntStream.generate;
 
public class SubtractiveGenerator implements IntSupplier {
static final int MOD = 1_000_000_000;
private int[] state = new int[55];
private int si, sj;
 
public SubtractiveGenerator(int p1) {
subrandSeed(p1);
}
 
void subrandSeed(int p1) {
int p2 = 1;
 
state[0] = p1 % MOD;
for (int i = 1, j = 21; i < 55; i++, j += 21) {
if (j >= 55)
j -= 55;
state[j] = p2;
if ((p2 = p1 - p2) < 0)
p2 += MOD;
p1 = state[j];
}
 
si = 0;
sj = 24;
for (int i = 0; i < 165; i++)
getAsInt();
}
 
@Override
public int getAsInt() {
if (si == sj)
subrandSeed(0);
 
if (si-- == 0)
si = 54;
if (sj-- == 0)
sj = 54;
 
int x = state[si] - state[sj];
if (x < 0)
x += MOD;
 
return state[si] = x;
}
 
public static void main(String[] args) {
generate(new SubtractiveGenerator(292_929)).limit(10)
.forEach(System.out::println);
}
}</lang>
 
<pre>467478574
512932792
539453717
20349702
615542081
378707948
933204586
824858649
506003769
380969305</pre>
 
=={{header|Mathematica}}==
Anonymous user