
I'm not sure where I got this PICK function from, and don't understand why it's written as it is, so I wanted to test it for randomness. It seems random enough. But if I understand the algorithm correctly, instead of selecting one of the elements from the list, it eliminates all the elements but one and that's the value it returns. Seems like a roundabout way of doing it. Comments? Also, is there a more direct way of printing an array? Output below. Michael ================= import System.Random import Data.Array.IO pick :: [a] -> IO a pick [] = undefined pick [x] = do return x pick (x:xs) = pick' x xs (2 :: Int) pick' :: (Num p, Random p) => t -> [t] -> p -> IO t pick' curr [] _ = do return curr pick' curr (next:rest) prob = do r <- getStdRandom (randomR (1,prob)) let curr' = if r == 1 then next else curr pick' curr' rest (prob+1) main = do arr <- newArray (1,9) 0 :: IO (IOArray Int Int) doLoop arr [1,2,3,4,5,6,7,8,9] 0 doLoop arr z k = do p <- pick z a <- readArray arr p writeArray arr p (a+1) if k > 10000 then do v <- readArray arr 1 print v v <- readArray arr 2 print v v <- readArray arr 3 print v v <- readArray arr 4 print v v <- readArray arr 5 print v v <- readArray arr 6 print v v <- readArray arr 7 print v v <- readArray arr 8 print v v <- readArray arr 9 print v else do doLoop arr z (k+1) =============== [michael@localhost ~]$ runhaskell array1.hs 1110 1117 1080 1169 1112 1119 1137 1084 1074 [michael@localhost ~]$