每个OpenGL / GLUT循环迭代的新StdGen

时间:2013-01-08 23:34:39

标签: opengl haskell random state

我有一个使用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用作下一次的生成器,但显然需要某种可变状态或某种性质的东西。

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

1 个答案:

答案 0 :(得分:3)

因为您仍然在IO,所以您可以通过setStdGen存储gen2

setStdGen gen2

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

另一个选项是split StdGen并使用newStdGen代替getStdGen使用其中一个结果。