RosettaCodeData/Task/Subtractive-generator/Seed7/subtractive-generator.seed7
Ingy döt Net 6f050a029e update
2013-06-05 21:47:54 +00:00

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;