[英]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.