gpt4 book ai didi

Haskell - 我如何获得随机点(Int,Int)

转载 作者:行者123 更新时间:2023-12-03 14:11:39 24 4
gpt4 key购买 nike

我正在尝试获取一组随机点 (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 ()))

任何帮助将非常感激。

最佳答案

首先,让我们稍微清理一下您的代码。 randomR有复数形式提供无限的随机值列表:randomRs .这简化了一些事情:

rndPoints1 :: [String] -> [Point]
rndPoints1 [] = []
rndPoints1 xs = zip x y
where
size = length xs
x = take size $ randomRs (25, 1000) (mkStdGen 1)
y = take size $ randomRs (25, 775) (mkStdGen 1)

我们可以进一步简化,使用 zip的属性,它在较短的列表用完后停止:
rndPoints2 :: [a] -> [Point]
rndPoints2 xs = map snd $ zip xs $ zip x y
where
x = randomRs (25, 1000) (mkStdGen 1)
y = randomRs (25, 775) (mkStdGen 1)

请注意,我还将传入列表的类型概括为 [a] .由于从未使用过这些值,因此它们不必是 String !

现在,它每次都给出相同的值,因为它使用 mkStdGen每次从相同的种子 ( 1 ) 创建一个伪随机生成器。如果你想让它每次都不一样,那么你需要在 IO中创建一个生成器这可以基于计算机的随机状态。而不是将整个计算放在 IO 中, 传入 StdGen 更干净:
rndPoints3 :: StdGen -> [Point]
rndPoints3 sg = zip x y
where
(sg1, sg2) = split sg
x = randomRs (25, 1000) sg1
y = randomRs (25, 775) sg2

pointsForLabels :: [a] -> StdGen -> [(a, Point)]
pointsForLabels xs sg = zip xs $ rndPoints3 sg

example3 :: [a] -> IO [(a, Point)]
example3 xs = newStdGen >>= return . pointsForLabels xs

在这里, newStdGen每次都会创建一个新的伪随机生成器,但它在 IO 中.这最终会传递给一个纯(非 IO)函数 rndPoints3它接受生成器,并返回一个无限的随机列表 Point s。在该函数中, split用于从中创建两个生成器,每个生成器用于派生坐标的随机列表。
pointsForLables现在分离出为每个标签匹配新随机点的逻辑。我还更改了它以返回更可能有用的标签对和 Point s。

最后, example3住在 IO ,并创建生成器并将其全部传递到其他纯代码中。

关于Haskell - 我如何获得随机点(Int,Int),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16207545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com