我刚开始学习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>
答案 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