Skip to content

Commit a21d767

Browse files
committed
Ensure seeds are between 1 and (modulus - 1)
1 parent 965d0b6 commit a21d767

1 file changed

Lines changed: 19 additions & 2 deletions

File tree

src/Test/QuickCheck/LCG.purs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,25 @@ lcgN = 1 `shl` 31 - 1
3232

3333
-- | Step the linear congruential generator
3434
lcgNext :: Int -> Int
35-
lcgNext n = U.fromJust $ fromNumber $ (toNumber lcgM * toNumber n + toNumber lcgC) % toNumber lcgN
35+
lcgNext n = U.fromJust $ fromNumber $ (toNumber lcgM * n' + toNumber lcgC) % toNumber lcgN
36+
where
37+
-- Ensure that the input is between seedMin and seedMax; the LCG will not
38+
-- work well for other inputs.
39+
n' = ensureBetween (toNumber seedMin) (toNumber seedMax) (toNumber n)
40+
41+
ensureBetween :: Number -> Number -> Number -> Number
42+
ensureBetween min max n =
43+
let rangeSize = max - min
44+
in (((n % rangeSize) + rangeSize) % rangeSize) + min
3645

3746
-- | Create a random seed
3847
randomSeed :: forall e. Eff (random :: RANDOM | e) Seed
39-
randomSeed = randomInt 1 lcgM
48+
randomSeed = randomInt seedMin seedMax
49+
50+
-- | The minimum permissible Seed value.
51+
seedMin :: Seed
52+
seedMin = 1
53+
54+
-- | The maximum permissible Seed value.
55+
seedMax :: Seed
56+
seedMax = lcgM - 1

0 commit comments

Comments
 (0)