如何在没有信号的情况下获得Elm 0.13中的随机数?

时间:2014-12-21 14:23:30

标签: random elm

我制作的游戏需要在屏幕上绘制随机线条。现在似乎随机需要一个信号在0.13工作(我们被迫在0.13工作)。那么如何获得这些随机数呢?

我从elm-lang网站提供的游戏骨架开始,然后得到了这个:

type UserInput = { space : Bool, keys : [KeyCode] }
type Input = { timeDelta : Float, userInput : UserInput }

userInput : Signal UserInput
userInput = lift2 UserInput Keyboard.space Keyboard.keysDown

framesPerSecond = 30

delta : Signal Float
delta = lift (\t -> t / framesPerSecond) (Time.fps framesPerSecond)

input : Signal Input
input = Signal.sampleOn delta (Signal.lift2 Input delta userInput)

gameState : Signal GameState
gameState = Signal.foldp stepGame defaultGame input

stepGame : Input -> GameState -> GameState
stepGame i g =
  if g.state == Start then *Get random floats*

现在在stepGame中,我想绘制随机线条。问题是I can only get random floats by providing a signal in 0.13。我通过步进功能关闭了输入信号,但是当我更改标题时可以说 stepGame : Signal Input -> GameState -> GameState它没有编译。那么如何在该函数中获取信号以获得一些随机数...我似乎无法找到解决方案,这让我发疯了。

1 个答案:

答案 0 :(得分:3)

有两种方法可以做到这一点。这实际上取决于你需要的随机数是否是静态的。

静态随机数

使用input的随机数扩展您的Random.floatList

type Input = { timeDelta : Float, userInput : UserInput, randoms : [Float] }

staticNoOfFloats = 42

input : Signal Input
input = Signal.sampleOn delta (Signal.lift3 Input delta userInput (Random.floatList (always staticNoOfFloats <~ delta)))

动态随机数

使用名为also outlined in this SO answer的社区库(generator)。您可以使用Random.range使用随机种子,方法与上面概述的方法非常相似。该库是一个纯伪随机数生成器,它基于生成一个随机数和一个新的Generator,它将生成下一个随机数。

为什么不在动态情况下使用Random.floatList

通常,如果您需要动态数量的随机数,则该数字取决于程序的当前状态。因为该状态是在foldp内捕获的,您在那里根据这些随机数进行更新,这使得无法使用&#34;信号函数&#34;,即某种类型的东西Signal a -> Signal b