challenge n人中m人が当選するくじ

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:)

Index

Feed

Other

Link

Pathtraq

loading...