2
我想創建隨機序列,同時還經過randomGenerator mkStdGen
哈斯克爾生成隨機序列,並通過發電機
我想出了以下內容,這似乎是工作,但我想知道是否有更好的/這樣做的適當方式?
genRandomSeq :: (RandomGen g, Random a) => Int -> (a,a) -> g -> ([a], g)
genRandomSeq n rng g =
foldr (\_ (acc,g') -> (\(a,g'') -> (a:acc, g'')) (randomR rng g')) ([],g) [0..n]
-- which is basically the same as
genRandomSeq 0 rng g collected = (collected, g)
genRandomSeq n rng g collected =
let (a,g') = randomR rng g in
genRandomSeq (n - 1) rng g' (a : collected)
(xs,g) = genRandomSeq 5 ('a','z') (mkStdGen 10)
(ys,g') = genRandomSeq 5 ('a','z') g
zs = "my nice string: " ++ xs ++ ys :: String
使用
*Main> genRandomSeq 5 ('a','z') (mkStdGen 10)
("rrsvfx",1928412403 1780294415)
*Main> zs
"my nice string: rrsvfxyaygon"
備註:如果代碼已經有效並且您對評論感興趣,則可能是[codereview.SE]的候選人。 – Zeta
不是。如果所有顯式傳球都困擾着你,你可以把它包裝在'State'中,那麼你的簽名看起來就像genRandomSeq ::(RandomGen g,Random a)=> Int - >(a,a) - > State g [a ]',如果你更喜歡這個,你會成爲法官。 – Cubic
MonadRandom(和MonadCryptoRandom)是兩個包,可以讓生成器保持單態,並提供簡單的例程,形式爲「讓我隨機選擇X型」。 –