我有一个程序,它使用 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 下次用作生成器,但显然这需要某种可变状态或其他东西具有这种性质。
执行我的要求的最佳方法是什么,以便每次显示运行时我都会得到不同的随机性?
最佳答案
由于您无论如何都处于 IO
中,因此您可以通过 setStdGen
存储 gen2
:
setStdGen gen2
这样你的下一轮将从上一轮停止的地方开始。
另一种选择是分割
StdGen
并使用newStdGen
来使用其中一个结果。而不是 getStdGen
。
关于opengl - 每个 OpenGL/GLUT 循环迭代的新 StdGen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14225904/