|
module LCG where
|
|
|
|
import Data.Bits
|
|
|
|
modulus = 2^32
|
|
multiplier = 1103515245
|
|
increment = 12345
|
|
shiftval = 16
|
|
andmask = 0x7FFF
|
|
|
|
lcg_pseudorandom_internal :: Integer -> [Integer]
|
|
lcg_pseudorandom_internal n = pseudo_val:(lcg_pseudorandom_internal n_new)
|
|
where n_new = (multiplier * n + increment) `mod` modulus
|
|
pseudo_val = (shiftR n shiftval) .&. andmask
|
|
|
|
--take a seed, a length of units vector and number of units and give a vector of orders
|
|
lcg :: Int -> Int -> Int -> [Int]
|
|
lcg seed len num = map (\x -> fromInteger (x `mod` toInteger len)) finite_vec
|
|
where finite_vec = take num (lcg_pseudorandom_internal (toInteger seed))
|