我在寫了一段令人沮喪的研究之後寫了這篇文章,我希望這裏有人能夠啓發我關於這個話題。簡單的隨機數生成
我想產生一個Haskell函數的簡單隨機數,但很可惜,這似乎是不可能沒有的種種不平凡的元素,如單子,asignation在「做」的做,創造發電機等
理想情況下,我正在尋找C的「rand()」的等價物。但經過多次搜索,我相當確信沒有這樣的事情,因爲語言是如何設計的。 (如果有,請有人賜教)。因爲這似乎不可行,所以我想找到一種方法來獲得我的特定問題的隨機數字,以及如何獲得隨機數字的一般說明。
prefixGenerator :: (Ord a, Arbitrary a) => Gen ([a],[a])
prefixGenerator = frequency [
(1, return ([],[])),
(2, do {
xs1 <- orderedListEj13 ;
xs2 <- orderedListEj13 ;
return (xs1,xs2)
}),
(2, do {
xs2 <- orderedListEj13 ;
return ((take RANDOMNUMBERHERE xs2),xs2)
})
]
我試圖去與QuickCheck握手,但我無法使用隨機數字使它很難。我試過類似this(通過把一個drawInt 0(長度xs2)而不是RANDOMNUMBERHERE),但我堅持採取需要一個Int的事實,該方法留給我一個IO Int,這似乎不可能轉換爲Int根據this。
回想一下,Haskell是沒有副作用的語言。簡而言之,這意味着*不能是一個函數,例如C的'rand',每次調用它時都會給出一個僞隨機數。如果'rand'是一個純粹的Haskell函數給出了一個'Int',那麼它每次都給出相同的'Int' * *。但是,你可以做的是創建純函數,它將*隨機數發生器的狀態*作爲輸入,並返回下一個僞隨機數和發生器的新狀態。請參閱[System.Random](http://hackage.haskell.org/packages/archive/random/latest/doc/html/System-Random.html#v:random) – gspr 2012-03-16 20:36:26
後續工作:「IO」單元,與您一樣當你想要管理一個全局的隨機狀態,或者例如用系統熵初始化你的發生器(這顯然需要與外界進行交互)時,纔會在'System.Random'模塊中使用。 – gspr 2012-03-16 20:39:43