RosettaCodeData/Task/Subtractive-generator/ALGOL-68/subtractive-generator.alg
2024-11-04 21:53:44 -08:00

37 lines
1 KiB
Text

BEGIN # subtractive generator - translated from the C/EasyLang samples #
INT modulus = 1 000 000 000;
INT max state = 55;
[ 0 : max state - 1 ]INT state;
INT sgi := 0, sgj := 0;
PROC subrand seed = ( INT p1in )VOID: BEGIN
INT p1 := p1in, p2 := 1;
state[ 0 ] := p1 MOD modulus;
INT j := 21; # not sure how 21 is chosen, though it is coprime to max state #
TO max state - 1 DO
state[ j ] := p2;
p2 := ( p1 - p2 ) MOD modulus;
p1 := state[ j ];
j +:= 21 MODAB max state
OD;
sgi := 0;
sgj := 24; # the task states this value (24) should be coprime to max state #
FROM 0 TO ( 3 * max state ) - 1 DO
VOID( subrand )
OD
END;
PROC subrand = INT: BEGIN
IF sgi = sgj THEN
subrand seed( 0 )
FI;
sgi -:= 1 MODAB max state;
sgj -:= 1 MODAB max state;
state[ sgi ] -:= state[ sgj ] MODAB modulus
END;
subrand seed( 292929 );
TO 10 DO
print( ( whole( subrand, 0 ), newline ) )
OD
END