michael rice nowgate at yahoo.com
Sat Jan 30 14:59:08 EST 2010

```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
writeArray arr p (a+1)
if k > 10000
then do
print v
print v
print v
print v
print v
print v
print v
print v
print v
else do
doLoop arr z (k+1)

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

[michael at localhost ~]\$ runhaskell array1.hs
1110
1117
1080
1169
1112
1119
1137
1084
1074
[michael at localhost ~]\$

-------------- next part --------------
An HTML attachment was scrubbed...