# 99 questions/Solutions/24

### From HaskellWiki

< 99 questions | Solutions(Difference between revisions)

(Added an alternative solution!) |
|||

Line 21: | Line 21: | ||

<haskell> |
<haskell> |
||

diff_select n to = rnd_select [1..to] n |
diff_select n to = rnd_select [1..to] n |
||

+ | </haskell> |
||

+ | |||

+ | Alternative solution: |
||

+ | <haskell> |
||

+ | diffSelect :: Int -> Int -> IO [Int] |
||

+ | diffSelect n m = do |
||

+ | gen <- getStdGen |
||

+ | return . take n $ randomRs (1, m) gen |
||

</haskell> |
</haskell> |

## Revision as of 06:03, 15 August 2011

Lotto: Draw N different random numbers from the set 1..M.

import System.Random diff_select :: Int -> Int -> IO [Int] diff_select n to = diff_select' n [1..to] diff_select' 0 _ = return [] diff_select' _ [] = error "too few elements to choose from" diff_select' n xs = do r <- randomRIO (0,(length xs)-1) let remaining = take r xs ++ drop (r+1) xs rest <- diff_select' (n-1) remaining return ((xs!!r) : rest)

The random numbers have to be distinct!

In order to use randomRIO here, we need import module System.Random.

As can be seen, having implemented problem 23, rnd_select, the solution is trivial.

diff_select n to = rnd_select [1..to] n

Alternative solution:

diffSelect :: Int -> Int -> IO [Int] diffSelect n m = do gen <- getStdGen return . take n $ randomRs (1, m) gen