2011-11-02 71 views
1

我試圖在0(含)到100(不含)的範圍內的Haskell mkStdGen中生成10個隨機數。Haskell中的隨機數發生器

東西等同於Java代碼

Random ran = new Random(); 
ran.nextInt(100); 

注意的,我必須使用mkStdGen

這是我迄今爲止
rand low high seed = fst (randomR (low, high) (mkStdGen seed))
randomlist :: Int -> Int -> Int -> [Int]
randomlist l h num = take num (map (rand l h) [0..])

+2

這功課嗎?你能告訴我們到目前爲止你有什麼代碼嗎? –

+0

下一步(mkStdGen 3)是我到目前爲止,我仍在閱讀文檔。但是有一個特定的代碼片斷,會ran.nextInt(100)會使事情變得更容易理解。 – nobody

+0

...大多數haskell文檔不喜歡舉個具體的例子 – nobody

回答

6
import System.Random 

tenPseudorandomNumbers :: Int -> [Int] 
tenPseudorandomNumbers seed = take 10 . randomRs (0, 99) . mkStdGen $ seed 

注意,這ISN」 t真的是僞隨機數,因爲mkStdGen需要一個明確的種子。 newStdGen會更好,如果您允許在IO中運行。

+1

嗯,它不是真正的隨機,它總是一個PRNG。如果以不純語言的方式獲取種子(例如從'/ dev/urand'中讀取,無論默認情況下是否執行Java),則這與Java示例一樣是僞隨機的。 – delnan

+0

確實;我會編輯說它甚至不是真正的僞隨機。 – dave4420

+3

我建議重構爲'pseudoRandoms :: StdGen - > Int - > [Int]',傳遞生成器並綁定爲參數,然後您可以使用'mkStdGen'或'newStdGen'獲取生成器並使用它以純粹的方式,即使它來自IO。在最後加上'take k'可以留給用戶而沒有問題。 –