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

标签 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 下次用作生成器,但显然这需要某种可变状态或其他东西具有这种性质。

执行我的要求的最佳方法是什么,以便每次显示运行时我都会得到不同的随机性?

最佳答案

由于您无论如何都处于 IO 中,因此您可以通过 setStdGen 存储 gen2 :

setStdGen gen2

这样你的下一轮将从上一轮停止的地方开始。

另一种选择是分割 StdGen 并使用newStdGen 来使用其中一个结果。而不是 getStdGen

关于opengl - 每个 OpenGL/GLUT 循环迭代的新 StdGen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14225904/

相关文章:

linux - "Modern"带有 GLFW 的 Linux 上的 OpenGL

c - OpenGL 3.3 不会绘制我的三角形

function - 如何检查Haskell项目中函数调用的参数过多还是过少

c++ - OpenGL - 每个三角形的像素数不正确

OpenGL 我什么时候可以再次开始发出命令

haskell - 如何使用 parsec 解析整数

haskell - 尝试处理 IO 操作

c++ - 计算并存储 6 个随机连接点的二维数组

javascript - 在移动设备的容器中点击时在随机位置显示单词

Android随机不重复字符串