elm(v0.15)中Random.initialSeed的预期行为是什么

elm(v0.15)中Random.initialSeed的预期行为是什么,random,elm,Random,Elm,initialSeed是否应该在每次调用时提供不同的种子?以下代码始终提供相同的值: import Graphics.Element exposing (show) import Random exposing(float, generate, initialSeed) main = show (generate (float 0 1 ) (initialSeed 31415)) 如果此代码运行正常,请给出随机数和random.generate用法的指针。initialSeed是一

initialSeed是否应该在每次调用时提供不同的种子?以下代码始终提供相同的值:

import Graphics.Element exposing (show)
import Random exposing(float, generate, initialSeed)

main = 
    show (generate (float 0 1 ) (initialSeed 31415))

如果此代码运行正常,请给出随机数和random.generate用法的指针。

initialSeed
是一个函数,给定
Int
生成一个
Seed
,然后可以在
generate
函数中使用。由于Elm是纯函数,因此赋予
generate
相同的
Generator
Seed
将始终产生相同的值。但是,
generate
还会返回下一个
种子
,以便在下次调用
generate
时使用。这允许您复制相同的随机生成值序列

用法示例:

import Random
import Graphics.Element as Element

-- Int Generator that computes random numbers in the range [0, 10]
intGenerator = Random.int 0 10

-- Change this to get different sequences.
seed = Random.initialSeed 42
--seed = Random.initialSeed 1234
--seed = Random.initialSeed 0

-- Generates a random x and returns the next seed to be used. Note:
-- This will always return the same x because it uses the same seed
-- this is a result of Elm being purely functional. However,
-- because this returns a new seed, you can use that to get the next
-- random value in the sequence
(x, seed') = (Random.generate intGenerator seed)

-- Generate the next element in the sequence
(y, seed'') = (Random.generate intGenerator seed')
(z, seed''') = (Random.generate intGenerator seed'')

main = Element.show [x, y, z]
在share-elm.com上:

希望这有帮助

在Elm 0.15中使用非常简单。(我假设您了解Elm是如何自然地将数据和代码划分为模型、更新和视图的。如果您对Elm体系结构的理解不可靠,请阅读教程和)

最重要的函数是,它返回一对:一个随机值和一个新种子。这个新种子可以再次传递到
generate
,以生成一个新的随机值和另一个种子。但是,传递相同的种子会产生相同的“随机”值。下面的代码呈现59

import Graphics.Element exposing (show)
import Random exposing (generate, int, initialSeed)

main =
  let (number, seed) = generate (int 0 99) (initialSeed 1234)
  in show number
您需要以某种方式在任意两个随机值生成之间保存此新种子。每次使用
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
导入图形。元素公开(元素,显示)
导入鼠标(单击)
导入随机公开(Seed、initialSeed、generate、int)
输入信号暴露(信号,foldp)
seed0=initialSeed 1234
类型别名模型={num:Int,seed:seed}
defaultModel:Model
defaultModel={num=0,seed=seed0}——模型中的初始种子
更新:()->模型->模型
更新模型=
let(newNum,newSeed)=生成(int 0 99)model.seed--新值和新种子

在{model|num中,谢谢。我真的看不出整个生成机制的意义。您需要一个信号来生成初始种子(否则您的程序每次运行时都会有相同的序列)我认为Elm曾经直接使用信号来提供随机性。由于信号总是在附近徘徊,发生器的额外复杂性给你带来了什么。