New seed. New random number. Right? Wrong.

I'm entering a new number to make a different seed for my generator each time through the loop, but my resulting numbers are anything but random. Where am I going wrong? Michael ============================= import System.Random import Control.Monad(when) main = do numberString <- getLine when (not $ null numberString) $ do let seed = read numberString let (randNumber, newGen) = randomR (1,6) (mkStdGen seed) :: (Int, StdGen) in putStrLn $ "Number is " ++ show randNumber main ============================= [michael@localhost ~]$ runhaskell zz.hs 12317 Number is 6 12371 Number is 6 37829 Number is 6 8713 Number is 6 71392 Number is 5 29492 Number is 6 41089 Number is 6 28483 Number is 6 78687 Number is 5 40703 Number is 6 86910 Number is 5 15608 Number is 6 56155 Number is 5 31575 Number is 6 72231 Number is 5 51815 Number is 6 20189 Number is 6 71533 Number is 5 17755 Number is 6 91161 Number is 5 [michael@localhost ~]$

interesting.
the sequences you get are random, but unless you enter a new number that is
really far from the previous one, the probability of getting the same first
random number seems high.
import System.Random
import Control.Monad(when)
main = do
numberString <- getLine
when (not $ null numberString) $ do
let seed = read numberString
let randNumbers = take 10 . randomRs (1::Int,6) $ mkStdGen seed
in putStrLn $ "Numbers are " ++ show randNumbers
main
1
Numbers are [6,5,2,6,5,2,3,2,5,5]
1000
Numbers are [6,4,3,2,6,5,2,3,3,5]
1000000
Numbers are [6,4,3,6,5,5,3,4,6,4]
1000000000
Numbers are [4,1,3,4,6,1,2,4,1,6]
1000000000000
Numbers are [1,2,3,3,5,5,4,6,6,4]
1000000000000000
Numbers are [1,4,2,6,6,2,4,2,6,5]
On Thu, Oct 8, 2009 at 10:15 PM, michael rice
I'm entering a new number to make a different seed for my generator each time through the loop, but my resulting numbers are anything but random.
Where am I going wrong?
Michael
=============================
import System.Random import Control.Monad(when)
main = do numberString <- getLine when (not $ null numberString) $ do let seed = read numberString let (randNumber, newGen) = randomR (1,6) (mkStdGen seed) :: (Int, StdGen) in putStrLn $ "Number is " ++ show randNumber main
=============================
[michael@localhost ~]$ runhaskell zz.hs 12317 Number is 6 12371 Number is 6 37829 Number is 6 8713 Number is 6 71392 Number is 5 29492 Number is 6 41089 Number is 6 28483 Number is 6 78687 Number is 5 40703 Number is 6 86910 Number is 5 15608 Number is 6 56155 Number is 5 31575 Number is 6 72231 Number is 5 51815 Number is 6 20189 Number is 6 71533 Number is 5 17755 Number is 6 91161 Number is 5
[michael@localhost ~]$
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe

On Thu, Oct 8, 2009 at 1:15 PM, michael rice
Where am I going wrong?
Your seeds are all extremely close together. The System.Random PRNG takes a 32-bit seed, but your seeds haven't even got a 17-bit range, so you're supplying approximately 19 parts per million of the possible range of entropy. Evidently this PRNG doesn't fare well with such a small amount of entropy. Try providing a broader range of seeds, and you'll see better results, e.g. 877554827 3377950428 3850407650 688135636 1134078904 973676998 3178940608 840705211 185598244
participants (3)
-
Bryan O'Sullivan
-
michael rice
-
Peter Verswyvelen