2015-08-09 60 views
3

initialSeed是否应该在每次调用它时提供一个不同的种子?下面的代码总是提供相同的价值:Random.initialSeed在elm中的预期行为(v0.15)

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

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

如果此代码正确的行为,你会好心给随机数和Random.generate的使用指针。

回答

3

initialSeed是一个函数,它给出一个Int产生一个Seed然后可以在generate函数中使用。由于Elm纯粹是功能性的,因此generateGeneratorSeed相同将始终产生相同的值。但是,generate也会返回下一个Seed,以供您在下一次拨打generate时使用。这允许您重现随机生成值的相同序列。

用法示例:http://share-elm.com/sprout/55c766b4e4b06aacf0e8be1b

希望这有助于:

上share-elm.com
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] 

1

在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 
+0

感谢。我无法真正看到整个生成机制的重点。你需要一个信号来产生初始种子(否则你的程序每次运行时都会有相同的序列),我认为Elm用来直接使用信号来提供随机性。由于信号总是处于悬挂状态,因此发生器增加的复杂性会增加您的收益。 – mikemay