54 lines
1.5 KiB
Text
54 lines
1.5 KiB
Text
$ include "seed7_05.s7i";
|
|
|
|
const integer: MOD is 1000000000;
|
|
|
|
const type: subtractiveGenerator is new struct
|
|
var array integer: state is [0 .. 54] times 0;
|
|
var integer: si is 0;
|
|
var integer: sj is 24;
|
|
end struct;
|
|
|
|
const func integer: subrand (inout subtractiveGenerator: generator) is forward;
|
|
|
|
const func subtractiveGenerator: subrandSeed (in var integer: p1) is func
|
|
result
|
|
var subtractiveGenerator: generator is subtractiveGenerator.value;
|
|
local
|
|
var integer: p2 is 1;
|
|
var integer: i is 0;
|
|
var integer: j is 21;
|
|
begin
|
|
generator.state[0] := p1 mod MOD;
|
|
for i range 1 to 54 do
|
|
generator.state[j] := p2;
|
|
p2 := (p1 - p2) mod MOD;
|
|
p1 := generator.state[j];
|
|
j := (j + 21) mod 55;
|
|
end for;
|
|
for i range 1 to 165 do
|
|
ignore(subrand(generator));
|
|
end for;
|
|
end func;
|
|
|
|
const func integer: subrand (inout subtractiveGenerator: generator) is func
|
|
result
|
|
var integer: subrand is 0;
|
|
begin
|
|
if generator.si = generator.sj then
|
|
generator := subrandSeed(0);
|
|
end if;
|
|
generator.si := pred(generator.si) mod 55;
|
|
generator.sj := pred(generator.sj) mod 55;
|
|
subrand := (generator.state[generator.si] - generator.state[generator.sj]) mod MOD;
|
|
generator.state[generator.si] := subrand;
|
|
end func;
|
|
|
|
const proc: main is func
|
|
local
|
|
var subtractiveGenerator: gen is subrandSeed(292929);
|
|
var integer: i is 0;
|
|
begin
|
|
for i range 1 to 10 do
|
|
writeln(subrand(gen));
|
|
end for;
|
|
end func;
|