2

我有一个使用 Haskell、OpenGL 和 GLUT 显示一堆随机三角形的程序。但是,我希望每次单击时都会更改随机三角形,或者具有类似性质的东西(当它们更改时并不重要)。

目前我的工作代码如下所示:

main :: IO ()
main = do
    (pname, _) <- getArgsAndInitialize
    createWindow $ "Haskellisa"
    -- TODO set based on command line args
    windowSize $= (Size 640 480)
    blend $= Enabled
    blendFunc $= (SrcAlpha, OneMinusSrcAlpha)
    displayCallback $= display
    keyboardMouseCallback $= Just (keyboardMouse)
    mainLoop

display :: IO ()
display = do
    clear [ ColorBuffer ]
    gen0 <- getStdGen
    let (tris,gen1) = randomTris 10 gen0
    let (cols,gen2) = randomColor4s 10 gen1
    let triColPairs = zip tris cols
    mapM_ (\(tri, col) -> drawTri tri col) triColPairs
    flush

然而,每次调用 getStdGen 时显示都采用相同的 StdGen。我想要的是let (cols,gen2)...下一次将线路中的 gen2 用作生成器,但显然这需要某种可变状态或类似性质的东西。

做我所问的最好方法是什么,这样每次显示运行时我都会得到不同的随机性?

4

1 回答 1

3

由于您IO无论如何都在,您可以gen2通过以下方式存储setStdGen

setStdGen gen2

所以你的下一轮在你之前停止的地方起飞。

另一种选择是split使用而不是StdGen使用其中一个结果。newStdGengetStdGen

于 2013-01-08T23:44:04.183 回答