Subtractive generator: Difference between revisions
Content added Content deleted
Walterpachl (talk | contribs) (add ooRexx (translated from REXX) |
Thundergnat (talk | contribs) (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}}== |