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 を使用します。私が望むのは、ラインのgen2がlet (cols,gen2)...次回のジェネレーターとして使用されることですが、明らかにそれにはある種の可変状態またはその性質が必要です。

ディスプレイが実行されるたびに異なるランダム性が得られるように、私が求めていることを行う最良の方法は何ですか?

4

1 に答える 1

3

あなたはIOとにかくいるので、次の方法で保存できgen2ますsetStdGen

setStdGen gen2

次のラウンドは、前に停止した場所から始まります。

もう 1 つのオプションは、splitの代わりに をStdGen使用して、結果の 1 つを使用することです。newStdGengetStdGen

于 2013-01-08T23:44:04.183 に答える