繁体   English   中英

如何在 Haskell 中创建随机二维数组?

[英]How can I create a random 2d array in Haskell?

我对 Haskell 还很陌生,在处理随机值时我总是很困惑。 这次我尝试创建一个 5x5 二维数组,其中每个单元格包含 4 个选项之间的随机值。

data Content = Bomb | One | Two | Three deriving (Eq, Show)
data Board = Array (Int, Int) Cell
data Cell = Cell {
   content :: Content,
   state :: CellState,
   notes :: Notes
}
type Notes = [String]
type CellState = Bool

然后在主要的 function 我输入

main :: IO()
main = do
let cellMatrix = createMatrix
print cellMatrix

如何创建一个创建板的 function,我需要在哪里做所有 g<-newStdGen 的事情?

任何建议将不胜感激!

在这里只关注问题的随机性方面,我们看到System.Random模块在其版本 1.2 中提供了一个uniformR function,它可以在指定范围内产生一个伪随机 integer 值。 通常,我们需要 (0,3) 范围内的 5*5=25 个值。

或者,同一个模块提供了一个randomRs function,但该模块提供了 integer 值的无限列表,因此无法返回生成器的更新值。 这可能不是您需要的。

我们可以使用 function 作为我们的主力,它返回有限计数的随机 integer 值,以及更新的生成器:

import  System.Random

getManyInts :: RandomGen g => g -> Int -> (Int,Int) -> ([Int],g)
getManyInts g0 count range =
    if (count <= 0)  then  ([], g0) 
                     else  let 
                                (v,g1)  = uniformR range g0
                                (vs,gf) = getManyInts g1 (count-1) range
                           in        
                                (v:vs, gf) 

为了从 integer 导航到 Enum 值,我们将使用稍微改进的Content类型:

data Content = Bomb | One | Two | Three
               deriving (Eq, Show, Enum, Bounded)

此时,我们可以编写一个小测试程序,提供 5*5=25 个Content类型的随机值:

main :: IO ()
main = do
    g0 <- newStdGen
    let  count = 5*5
         (loC, hiC) = (minBound :: Content, maxBound :: Content)
         intRange   = (fromEnum loC, fromEnum hiC)
         (xs, g1)   = getManyInts g0 count intRange
         cs         = (map toEnum xs) :: [Content]

    putStrLn $ "contents: " ++ (show cs)

测试程序output:

contents: [Two,Three,One,One,One,Two,One,Two,One,Bomb,Two,Two,One,Three,Bomb,Two,Two,Bomb,Three,One,One,Bomb,One,One,Bomb]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM