我有一个使用 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 用作生成器,但显然这需要某种可变状态或类似性质的东西。
做我所问的最好方法是什么,这样每次显示运行时我都会得到不同的随机性?