$ 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;