重複無し乱数
Posted feedbacks - Haskell
System.Random を使う。シャッフルをナイーブに実装したもの
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | module Main (main) where
import System.Environment
import System.Random
shuffle :: [a] -> StdGen -> Int -> [a] -> [a]
shuffle acc _ 0 _ = acc
shuffle acc g n xs = case randomR (0,n-1) g of
(i,g') -> case splitAt i xs of
(ys,z:zs) -> shuffle (z:acc) g' (n-1) (ys++zs)
main :: IO ()
main = do { x:_ <- getArgs
; g0 <- getStdGen
; let n = read x
; putStrLn $ show $ shuffle [] g0 n [1..n]
}
{-
% ./bingo 10
[4,10,3,2,9,5,7,8,6,1]
% ./bingo 10
[2,7,6,8,4,1,9,5,3,10]
% ./bingo 10
[1,7,3,10,6,4,8,2,5,9]
% ./bingo 10
[6,8,9,3,10,4,1,5,2,7]
-}
|
1 2 3 4 5 6 7 8 9 | import Random (randomRIO)
import Data.List ((\\))
bingo :: Int -> IO [Int]
bingo n = b [1..n] n []
where b [] n ret = return ret
b xs (n+1) ret = do
r <- randomRIO (0,n)
let m = xs !! r in b (xs \\ [m]) n (ret ++ [m])
|



raynstard
#3402()
Rating0/0=0.00
このお題はraynstardさんの投稿を元にしています。ご投稿ありがとうございました。 投稿の内容には表示のしかたも含まれていたのですが、 このお題では「重複しない1~nまでの乱数をどうやって作るか」という点に集中することにして、 結果の整形は続編としてこの後のお題で出すことにします。 サンプル入出力は下のようになります。
[ reply ]