【发布时间】:2013-04-25 06:07:09
【问题描述】:
我正在尝试获取一组随机点 (x,y) 以将图形节点绘制到屏幕上。我需要为传入的每个节点名称随机生成一个点。
我在 SO 页面上找到了此代码,并对其进行了一些修改以适合我,但它并没有真正满足我的需要。
我需要一个随机列表(尽可能随机)(Int,Int)。
无论如何,这是我目前所拥有的,当然,它每次都给出相同的值,所以它不是特别随机:)
rndPoints :: [String] -> [Point]
rndPoints [] = []
rndPoints xs = zip x y where
size = length xs
x = take size (tail (map fst $ scanl (\(r, gen) _ -> randomR (25::Int,1000::Int) gen) (random (mkStdGen 1)) $ repeat ()))
y = take size (tail (map fst $ scanl (\(r, gen) _ -> randomR (25::Int,775::Int) gen) (random (mkStdGen 1)) $ repeat ()))
任何帮助将不胜感激。
【问题讨论】:
-
你可以使用 QuickCheck 包中的 Arbitrary 吗?
-
除了每次调用函数得到相同点分布的问题外,使用两次
mkStdGen 1仍然是个坏主意。这将导致 x 坐标和 y 坐标之间的尴尬相关,在最坏的情况下导致仅沿一条线的点。 — 无论如何,包含大量重复代码的两行几乎总是很糟糕,有一种叫做the DRY principle的东西。