[Haskell-cafe] Generating random enums

michael rice nowgate at yahoo.com
Sat May 2 13:45:40 EDT 2009


OK, I think what you're saying is to work with (random) integers and use fromEnum and toEnum to get corresponding DayOfWeek. But I get this when I try to use toEnum:

[michael at localhost ~]$ ghci dow
GHCi, version 6.10.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling Main             ( dow.hs, interpreted )
Ok, modules loaded: Main.
*Main> fromEnum Wednesday
Loading package old-locale-1.0.0.1 ... linking ... done.
Loading package old-time-1.0.0.1 ... linking ... done.
Loading package random-1.0.0.1 ... linking ... done.
2
*Main> toEnum 2
*** Exception: Prelude.Enum.().toEnum: bad argument
*Main> 

Michael

--- On Fri, 5/1/09, John Van Enk <vanenkj at gmail.com> wrote:

From: John Van Enk <vanenkj at gmail.com>
Subject: Re: [Haskell-cafe] Generating random enums
To: "michael rice" <nowgate at yahoo.com>
Cc: haskell-cafe at haskell.org
Date: Friday, May 1, 2009, 12:36 PM

When you derive Enum, you get fromEnum and toEnum for free. You don't need your dow2Int stuff or int2Dow. Replace those with fromEnum and toEnum respectively.
 
/jve


On Fri, May 1, 2009 at 12:26 PM, michael rice <nowgate at yahoo.com> wrote:





I'm using the code below to generate random days of the week [Monday..Sunday].

Is there a better/shorter way to do this?

Michael

==============

[michael at localhost ~]$ ghci dow

GHCi, version 6.10.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.

Loading package base ... linking ... done.
[1 of 1] Compiling Main             ( dow.hs, interpreted )
Ok, modules loaded: Main.
*Main> random (mkStdGen 100) :: (DayOfWeek, StdGen)
Loading package old-locale-1.0.0.1 ... linking ... done.

Loading package old-time-1.0.0.1 ... linking ... done.
Loading package random-1.0.0.1 ... linking ... done.
(Friday,4041414 40692)
*Main> random (mkStdGen 123) :: (DayOfWeek, StdGen)
(Tuesday,4961736 40692)

*Main>

==============

import System.Random

data DayOfWeek
    = Monday
    | Tuesday
    | Wednesday
    | Thursday
    | Friday
    | Saturday
    | Sunday
    deriving (Show, Read, Eq, Enum, Ord, Bounded)


instance Random DayOfWeek where
  randomR (a,b) g = 
      case (randomIvalInteger (toInteger (dow2Int a), toInteger (dow2Int b)) g) of
        (x, g) -> (int2Dow x, g)
       where
         dow2Int Monday    = 0

         dow2Int Tuesday   = 1
         dow2Int Wednesday = 2
         dow2Int Thursday  = 3
         dow2Int Friday    = 4
         dow2Int Saturday  = 5
         dow2Int Sunday    = 6

     int2Dow 0    = Monday

     int2Dow 1    = Tuesday
     int2Dow 2    = Wednesday
     int2Dow 3    = Thursday
     int2Dow 4    = Friday
     int2Dow 5    = Saturday
     int2Dow 6    = Sunday

  random g      = randomR (minBound,maxBound) g


randomIvalInteger :: (RandomGen g, Num a) => (Integer, Integer) -> g -> (a, g)
randomIvalInteger (l,h) rng
 | l > h     = randomIvalInteger (h,l) rng
 | otherwise = case (f n 1 rng) of (v, rng') -> (fromInteger (l + v `mod` k), rng')

     where
       k = h - l + 1
       b = 2147483561
       n = iLogBase b k

       f 0 acc g = (acc, g)
       f n acc g = 
          let
       (x,g')   = next g
      in
      f (n-1) (fromIntegral x + acc * b) g'


iLogBase :: Integer -> Integer -> Integer
iLogBase b i = if i < b then 1 else 1 + iLogBase b (i `div` b)



 



_______________________________________________

Haskell-Cafe mailing list
Haskell-Cafe at haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe






-- 
/jve




      
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20090502/7d40f332/attachment.htm


More information about the Haskell-Cafe mailing list