Subtractive generator: Difference between revisions

Content added Content deleted
(add ooRexx (translated from REXX)
(Rename Perl 6 -> Raku, alphabetize, minor clean-up)
Line 302: Line 302:
return 0;
return 0;
}</lang>
}</lang>

=={{header|C sharp|C#}}==
<lang csharp>
public class SubtractiveGenerator {
public static int MAX = 1000000000;
private int[] state;
private int pos;

private int mod(int n) {
return ((n % MAX) + MAX) % MAX;
}

public SubtractiveGenerator(int seed) {
state = new int[55];

int[] temp = new int[55];
temp[0] = mod(seed);
temp[1] = 1;
for(int i = 2; i < 55; ++i)
temp[i] = mod(temp[i - 2] - temp[i - 1]);

for(int i = 0; i < 55; ++i)
state[i] = temp[(34 * (i + 1)) % 55];

pos = 54;
for(int i = 55; i < 220; ++i)
next();
}

public int next() {
int temp = mod(state[(pos + 1) % 55] - state[(pos + 32) % 55]);
pos = (pos + 1) % 55;
state[pos] = temp;
return temp;
}

static void Main(string[] args) {
SubtractiveGenerator gen = new SubtractiveGenerator(292929);
for(int i = 220; i < 230; ++i)
Console.WriteLine(i.ToString() + ": " + gen.next().ToString());
}
}
</lang>

{{out}}
<pre>
220: 467478574
221: 512932792
222: 539453717
223: 20349702
224: 615542081
225: 378707948
226: 933204586
227: 824858649
228: 506003769
229: 380969305
</pre>


=={{header|C++}}==
=={{header|C++}}==
Line 380: Line 437:
result = 378707948
result = 378707948
result = 933204586
result = 933204586
</pre>

=={{header|C sharp|C#}}==
<lang csharp>
public class SubtractiveGenerator {
public static int MAX = 1000000000;
private int[] state;
private int pos;

private int mod(int n) {
return ((n % MAX) + MAX) % MAX;
}

public SubtractiveGenerator(int seed) {
state = new int[55];

int[] temp = new int[55];
temp[0] = mod(seed);
temp[1] = 1;
for(int i = 2; i < 55; ++i)
temp[i] = mod(temp[i - 2] - temp[i - 1]);

for(int i = 0; i < 55; ++i)
state[i] = temp[(34 * (i + 1)) % 55];

pos = 54;
for(int i = 55; i < 220; ++i)
next();
}

public int next() {
int temp = mod(state[(pos + 1) % 55] - state[(pos + 32) % 55]);
pos = (pos + 1) % 55;
state[pos] = temp;
return temp;
}

static void Main(string[] args) {
SubtractiveGenerator gen = new SubtractiveGenerator(292929);
for(int i = 220; i < 230; ++i)
Console.WriteLine(i.ToString() + ": " + gen.next().ToString());
}
}
</lang>

{{out}}
<pre>
220: 467478574
221: 512932792
222: 539453717
223: 20349702
224: 615542081
225: 378707948
226: 933204586
227: 824858649
228: 506003769
229: 380969305
</pre>
</pre>


Line 1,271: Line 1,271:
615542081
615542081
...</pre>
...</pre>

=={{header|Perl 6}}==
{{trans|Perl}}
{{works with|Rakudo|2018.03}}

<lang perl6>sub bentley-clever($seed) {
constant $mod = 1_000_000_000;
my @seeds = ($seed % $mod, 1, (* - *) % $mod ... *)[^55];
my @state = @seeds[ 34, (* + 34 ) % 55 ... 0 ];

sub subrand() {
push @state, (my $x = (@state.shift - @state[*-24]) % $mod);
$x;
}

subrand for 55 .. 219;

&subrand ... *;
}

my @sr = bentley-clever(292929);
.say for @sr[^10];</lang>
Here we just make the seeder return the random sequence as a lazy list.

{{out}}
<pre>467478574
512932792
539453717
20349702
615542081
378707948
933204586
824858649
506003769
380969305</pre>


=={{header|Phix}}==
=={{header|Phix}}==
Line 1,611: Line 1,576:
(define rand (create-substractive-generator 292929))
(define rand (create-substractive-generator 292929))
(build-list 3 (lambda (_) (rand))) ;returns a list made from the 3 wanted numbers</lang>
(build-list 3 (lambda (_) (rand))) ;returns a list made from the 3 wanted numbers</lang>

=={{header|Raku}}==
(formerly Perl 6)
{{trans|Perl}}
{{works with|Rakudo|2018.03}}

<lang perl6>sub bentley-clever($seed) {
constant $mod = 1_000_000_000;
my @seeds = ($seed % $mod, 1, (* - *) % $mod ... *)[^55];
my @state = @seeds[ 34, (* + 34 ) % 55 ... 0 ];

sub subrand() {
push @state, (my $x = (@state.shift - @state[*-24]) % $mod);
$x;
}

subrand for 55 .. 219;

&subrand ... *;
}

my @sr = bentley-clever(292929);
.say for @sr[^10];</lang>
Here we just make the seeder return the random sequence as a lazy list.

{{out}}
<pre>467478574
512932792
539453717
20349702
615542081
378707948
933204586
824858649
506003769
380969305</pre>


=={{header|REXX}}==
=={{header|REXX}}==