RosettaCodeData/Task/Linear-congruential-generator/SequenceL/linear-congruential-generat...

27 lines
916 B
Plaintext

import <Utilities/Random.sl>;
main(args(2)) :=
let
bsdRandomGenerator := newRandomGenerator(0, 0, 2147483647, bsdNext);
msRandomGenerator := newRandomGenerator(0, 0, 32767, msNext);
// Create a random sequence with each one of the generators
numbers := getRandomSequence([bsdRandomGenerator, msRandomGenerator], 10).Value;
in
"BSD Values: " ++ toString(numbers[1]) ++
"\nMS Values: " ++ toString(numbers[2]);
bsdNext(RG) :=
let
newSeed := ((1103515245 -> int64 * RG.Seed + 12345) mod 2147483648) -> int32;
in
(Value : newSeed,
Generator : (Seed : newSeed, RandomMin : RG.RandomMin, RandomMax : RG.RandomMax, NextFunction : RG.NextFunction));
msNext(RG) :=
let
newSeed := ((214013 -> int64 * RG.Seed + 2531011) mod 2147483648) -> int32;
in
(Value : newSeed / 65536,
Generator : (Seed : newSeed, RandomMin : RG.RandomMin, RandomMax : RG.RandomMax, NextFunction : RG.NextFunction));