diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,7 @@
+# 0.0.2 (2015-05-15)
+
+* Implement memoized randomRs', randoms', randomRIO', randomIO'.
+
 # 0.0.1 (2015-05-14)
 
 * Initial release.
diff --git a/acme-memorandom.cabal b/acme-memorandom.cabal
--- a/acme-memorandom.cabal
+++ b/acme-memorandom.cabal
@@ -1,6 +1,6 @@
 name: acme-memorandom
 category: ACME
-version: 0.0.1
+version: 0.0.2
 license: MIT
 license-file: LICENSE
 author: Johan Kiviniemi <devel@johan.kiviniemi.name>
@@ -31,7 +31,7 @@
 library
   exposed-modules: System.Random.MemoRandom
   hs-source-dirs: src
-  other-extensions: TypeFamilies, TypeOperators
+  other-extensions: CPP, TypeFamilies, TypeOperators
   build-depends: base == 4.*
                , MemoTrie == 0.6.*
                , random == 1.*
diff --git a/src/System/Random/MemoRandom.hs b/src/System/Random/MemoRandom.hs
--- a/src/System/Random/MemoRandom.hs
+++ b/src/System/Random/MemoRandom.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE TypeOperators #-}
 
@@ -14,11 +15,27 @@
 -- a lazy table indexed by serialized 'StdGen'. Monomorphism is used to
 -- facilitate memoization, users should adapt their design to work with random
 -- 'Int' values only.
-module System.Random.MemoRandom (randomR', random') where
+module System.Random.MemoRandom
+  ( randomR'
+  , random'
+  , randomRs'
+  , randoms'
+  , randomRIO'
+  , randomIO'
+  ) where
 
 import Data.MemoTrie
 import System.Random
 
+#ifdef __GLASGOW_HASKELL__
+import GHC.Exts (build)
+#else
+-- | A dummy variant of build without fusion.
+{-# INLINE build #-}
+build :: ((a -> [a] -> [a]) -> [a] -> [a]) -> [a]
+build g = g (:) []
+#endif
+
 newtype StdGen' = StdGen' { unStdGen' :: StdGen }
 
 instance HasTrie StdGen' where
@@ -34,3 +51,36 @@
 -- | A memoized variant of 'random'.
 random' :: StdGen -> (Int, StdGen)
 random' = memo (random . unStdGen') . StdGen'
+
+-- | A memoized variant of 'randomRs'.
+{-# INLINE randomRs' #-}
+randomRs' :: (Int, Int) -> StdGen -> [Int]
+randomRs' ival g = build (\cons _nil -> buildRandoms cons (randomR' ival) g)
+
+-- | A memoized variant of 'randoms'.
+{-# INLINE randoms' #-}
+randoms' :: StdGen -> [Int]
+randoms' g = build (\cons _nil -> buildRandoms cons random' g)
+
+-- | A memoized variant of 'randomRIO'.
+randomRIO' :: (Int, Int) -> IO Int
+randomRIO' ival = getStdRandom (randomR' ival)
+
+-- | A memoized variant of 'randomIO'.
+randomIO' :: IO Int
+randomIO' = getStdRandom random'
+
+-- | Produce an infinite list-equivalent of random values.
+--
+-- Copied from System.Random verbatim (but originally written by the author of
+-- MemoRandom, commit 4695ffa).
+{-# INLINE buildRandoms #-}
+buildRandoms :: RandomGen g
+             => (a -> as -> as)  -- ^ E.g. '(:)' but subject to fusion
+             -> (g -> (a,g))     -- ^ E.g. 'random'
+             -> g                -- ^ A 'RandomGen' instance
+             -> as
+buildRandoms cons rand = go
+  where
+    -- The seq fixes part of #4218 and also makes fused Core simpler.
+    go g = x `seq` (x `cons` go g') where (x,g') = rand g
