"article"
我目前有这个来生成我的图表。 然而,通过在ghci上使用样本,我注意到它要么不生成边缘,要么生成单个边缘。 是否可以控制生成的边数? 我该怎么做?
编辑:图表在以下情况下被视为有效: 1-存在边的源节点和目标节点。 2-A节点不能成为多个Edge的源。
答案 0 :(得分:3)
arbitrary
值是Gen
monad中的值。您可以在此monad中执行更多操作,而不仅仅将arbitrary
值组合在一起。您可以执行任何其他Gen
操作,包括choose
:
choose :: Random a => (a, a) -> Gen a
在给定的包含范围内生成随机元素。
您可以使用choose
生成除arbitrary
之外的其他随机值。
instance (Ord v, Arbitrary v) => Arbitrary (Graph v) where
arbitrary = do
nodes <- arbitrary
let
lNodes = toList nodes
numNodes = length lNodes
arbitraryEdge = do
source <- elements lNodes
target <- elements lNodes
return $ Edge {
source = source,
target = target
}
numEdges <- choose (0, numNodes * numNodes)
lEdges <- vectorOf numEdges arbitraryEdge
return $ Graph {nodes = nodes, edges = fromList lEdges}
在生成大图时,这种天真的实现并不是非常有效。如果每次使用elements