n人中m人が当選するくじ
Posted feedbacks - Haskell
Arrow を使えばもっと綺麗に書けるかも。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import System.Random
shuffle :: [a] -> StdGen -> ([a], StdGen)
shuffle [] g = ([], g)
shuffle xs g = let (needle , g' ) = randomR (0, length xs - 1) g
(left , picked:right) = splitAt needle xs
(unpicked, g'' ) = shuffle (left ++ right) g'
in
(picked:unpicked, g'')
lot :: Int -> Int -> StdGen -> ([Int], StdGen)
lot n m g = let (shuffled, g') = shuffle [1..n] g
in
(take m shuffled, g')
main = do xs <- getStdRandom (lot 1000000 999999)
mapM_ (putStrLn . show) xs
|
ナイーブに。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import System.Environment
import System.Random
main :: IO ()
main = do { (p:q:_) <- getArgs
; let (n,m) = (read p,read q)
; newStdGen >>= loop n m [1..n] >>= print
}
loop _ 0 _ _ = return []
loop n m s g
= case randomR (0,n-1) g of
(n',g') -> case splitAt n' s of
(xs,y:ys) -> loop (n-1) (m-1) (xs++ys) g' >>= return . (y:)
|


にしお
#3360()
Rating0/0=0.00
[ reply ]