如何使用随机包将结果映射到haskell中的特定值?

时间:2014-11-01 21:55:13

标签: haskell

我刚开始学习Haskell,我正在编写我的第一个代码。我在这里做的是编写一个函数,它接受两个参数返回一个整数列表列表,其中每个列表的长度为n(形成一个nxn网格),每个整数的概率p都有一个值,(1 -p)是空的(没有价值)。我想使用编码0 =空,1 =值。

test :: Int -> Float -> [[Int]]    
test n p = do
          let values = round(n*n*p)
              noValues = n*n - values
          print values
          print noValues

    main = do
         test 4 0.4

values变量将为我们提供网格中具有值的元素数量,noValues将为我们提供将为空的数字。现在,我如何确定哪些单元格具有值,哪些单元格不具有值? 我打算使用随机包,如:

import System.Random
g <- getStdGen
take n (randoms g :: [Double])

这给了我一个浮动值的列表,但是我不明白如何将它应用于我的问题,即如何将它变成列表列表,然后用值0和1映射它? / p>

2 个答案:

答案 0 :(得分:0)

您可以使用randoms生成所需长度范围(0,1)中Double的列表,然后将结果值映射到元素类型(如果它满足给定的阈值){ {1}}。然后,您需要将一维列表转换为二维网格,例如

p

然后,您可以传递所需的随机生成器,例如genElements :: (RandomGen g) => g -> Float -> Int -> [[Int]] genElements r p n = mkGrid $ map (\d -> if d <= p then 1 else 0) $ take (n*n) (randoms r) where mkGrid r = unfoldr nextRow (r, n) nextRow (_, 0) = Nothing nextRow (es, i) = let (r, rest) = splitAt n es in Just (r, (rest, i-1))

StdGen

答案 1 :(得分:0)

我假设您可以创建genValue :: Float -> IO Int之类的函数,该函数以p为参数并提供随机指标。

然后你可以像

那样生成网格
 grid :: Int -> Float -> IO [[Int]]
 grid n = replicateM n . replicateM n . genValue