[* * (seed) lsx -- * Seeds the subtractive generator. * Uses register R to hold the state. *]sz [ [* Fill ring buffer R[0] to R[54]. *]sz d 54:R SA [A = R[54] = seed]sz 1 d 33:R SB [B = R[33] = 1]sz 12 SC [C = index 12, into array R.]sz [55 -]SI [ [Loop until C is 54:]sz lA lB - d lC:R [R[C] = A - B]sz lB sA sB [Parallel let A = B and B = A - B]sz lC 34 + d 55 !>I d sC [C += 34 (mod 55)]sz 54 !=L ]d SL x [* Point R[55] and R[56] into ring buffer. *]sz 0 55:R [R[55] = index 0, of 55th last number.]sz 31 56:R [R[56] = index 31, of 24th last number.]sz [* Stir ring buffer. *]sz 165 [ [Loop 165 times:]sz 55;R;R 56;R;R - 55;R:R [Discard a random number.]sz 55;R 1 + d 55 !>I 55:R [R[55] += 1 (mod 55)]sz 56;R 1 + d 55 !>I 56:R [R[56] += 1 (mod 55)]sz 1 - d 0 I 55:R [R[55] += 1 (mod 55)]sz 56;R 1 + d 55 !>I 56:R [R[56] += 1 (mod 55)]sz [1000000000 +]sI 1000000000 % d 0 >I [Random number = it (mod 10^9)]sz LIsz ]sr [* Seed with 292929 and print first three random numbers. *]sz 292929 lsx lrx psz lrx psz lrx psz