User guide
3.7. COROUTINE EXAMPLES 89
// ################### Random number generator #######################
// The following random number generator is based on one give
// in Knuth: The art of programming, vol 2, p 26.
LET rnd(n) = VALOF
{ LET val = (ranv!rani + ranv!ranj) & #x_FFF_FFFF
ranv!rani := val
rani := (rani + 1) MOD 55
ranj := (ranj + 1) MOD 55
RESULTIS val MOD n
}
AND initrnd(seed) = VALOF
{ LET a, b = #x_234_5678+seed, #x_536_2781
ranv := getvec(54)
UNLESS ranv RESULTIS FALSE
FOR i = 0 TO 54 DO
{ LET t = (a+b) & #x_FFF_FFFF
a := b
b := t
ranv!i := t
}
rani, ranj := 55-55, 55-24 // ie: 0, 31
RESULTIS TRUE
}
AND closernd() BE IF ranv DO freevec(ranv)
// ################### Priority Queue functions ######################
AND prq() BE
{ FOR i = 1 TO priqn DO writef(" %i4", priq!i!0)
newline()
}
AND insertevent(event) BE
{ priqn := priqn+1 // Increment number of events
upheap(event, priqn)
}
AND upheap(event, i) BE
{ LET eventtime = event!0
//writef("upheap: eventtime=%n i=%n*n", eventtime, i)
{ LET p = i/2 // Parent of i
UNLESS p & eventtime < priq!p!0 DO
{ priq!i := event
RETURN
}
priq!i := priq!p // Demote the parent
i := p
} REPEAT
}