16 lines
399 B
Haskell
16 lines
399 B
Haskell
import Data.Bits
|
|
|
|
import Data.Word
|
|
import Data.List
|
|
|
|
next :: Word64 -> (Word64, Word64)
|
|
next state = f4 $ state + 0x9e3779b97f4a7c15
|
|
where
|
|
f1 z = (z `xor` (z `shiftR` 30)) * 0xbf58476d1ce4e5b9
|
|
f2 z = (z `xor` (z `shiftR` 27)) * 0x94d049bb133111eb
|
|
f3 z = z `xor` (z `shiftR` 31)
|
|
f4 s = ((f3 . f2 . f1) s, s)
|
|
|
|
randoms = unfoldr (pure . next)
|
|
|
|
toFloat n = fromIntegral n / (2^64 - 1)
|