在Elm 0.15中使用Random
非常容易。 (我假设你理解Elm如何自然地将数据和代码分离成模型,更新和视图。如果你对Elm体系结构的理解不稳定,请阅读The Elm Architecture教程和simple explanation of model-view-update pattern)。
最重要的功能是generate
,它返回一对:一个随机值和一个新种子。这个新的种子,你可以再次通过generate
,产生一个新的随机值和另一个种子。然而,传递相同的种子会产生相同的“随机”值。下面的代码使:
import Graphics.Element exposing (show)
import Random exposing (generate, int, initialSeed)
main =
let (number, seed) = generate (int 0 99) (initialSeed 1234)
in show number
您需要保存的任何2个随机值代以某种方式之间的这种新的种子。并且每次使用generate
时,请传递新种子而不是旧种子。你是怎样做的?
您保存种子模型中,并确保在更新阶段,你覆盖旧的种子与新种子:
import Graphics.Element exposing (Element, show)
import Mouse exposing (clicks)
import Random exposing (Seed, initialSeed, generate, int)
import Signal exposing (Signal, foldp)
seed0 = initialSeed 1234
type alias Model = { num : Int, seed : Seed }
defaultModel : Model
defaultModel = { num = 0, seed = seed0 } -- initial seed in the model
update :() -> Model -> Model
update _ model =
let (newNum, newSeed) = generate (int 0 99) model.seed -- new value and new seed
in { model | num <- newNum, seed <- newSeed } -- update model with new seed
view : Model -> Element
view model = show model.num
-- new random value each time mouse clicked
main = Signal.map view <| foldp update defaultModel clicks
感谢。我无法真正看到整个生成机制的重点。你需要一个信号来产生初始种子(否则你的程序每次运行时都会有相同的序列),我认为Elm用来直接使用信号来提供随机性。由于信号总是处于悬挂状态,因此发生器增加的复杂性会增加您的收益。 – mikemay