Haskell yolculuğumun bir parçası olarak, bir raytracer uyguluyor ve kodun çeşitli yerlerinde rastgele sayı dizileri çizebilmem gerekiyor. Tipik olarak her piksel için 64 örnek alıp pikselleri paralel olarak hesaplamak istiyorum.Rasgele sayı dizisi un Haskell ve State Monad, ne yapıyorum yanlış?
Bunu başarmak için eyalet monadına bakıyordum ve bu cevabı Sampling sequences of random numbers in Haskell tarafından yönlendirildim ancak yazdığım kod sonlanmıyor ve bellek tüketimi patlıyor. İşte
kod soyutlanmış bir parçasıdır: Ben rasgele sayı yeni listeler almak için kodsampleUniform
birkaç kez çağırmak edebilmek için attırmak ama
runhaskell test.hs
yaparsak, bu lis
[
ilk karakteri verir ve sonra görünüşte sonsuz bir döngüde sıkışmış.
module Main (main
, computeArray) where
import Control.Monad
import Control.Monad.State (State, evalState, get, put)
import System.Random (StdGen, mkStdGen, random)
import Control.Applicative ((<$>))
type Rnd a = State StdGen a
runRandom :: Rnd a -> Int -> a
runRandom action seed = evalState action $ mkStdGen seed
rand :: Rnd Double
rand = do
gen <- get
let (r, gen') = random gen
put gen'
return r
{- Uniform distributions -}
uniform01 :: Rnd [Double]
uniform01 = mapM (\_ -> rand) $ repeat()
{- Get n samples uniformly distributed between 0 and 1 -}
sampleUniform :: Int -> Rnd [Double]
sampleUniform n = liftM (take n) uniform01
computeArray :: Rnd [Bool]
computeArray = do
samples1 <- sampleUniform 10
samples2 <- sampleUniform 10
let dat = zip samples1 samples2
return $ uncurry (<) <$> dat
main :: IO()
main = do
let seed = 48
let res = runRandom computeArray seed
putStrLn $ show res
Ayrıca bkz [Haskell dizisi fonksiyonu tembel olamaz ya da neden özyinelemeli monadic fonksiyonlar tembel olamaz Neden] (http://stackoverflow.com/q ile/31892418/1333025) .. –