Каково ожидаемое поведение Random.initialSeed в elm (v0.15)
Должен ли initialSeed предоставлять разное начальное число при каждом вызове? Следующий код всегда предоставляет одно и то же значение:
import Graphics.Element exposing (show)
import Random exposing(float, generate, initialSeed)
main =
show (generate (float 0 1 ) (initialSeed 31415))
Если этот код работает правильно, не могли бы вы дать указатель на использование случайных чисел и Random.generate.
2 ответа
initialSeed
это функция, которая дала Int
производит Seed
который затем может быть использован в generate
функция. Потому что вяз является чисто функциональным, давая generate
тот же самый Generator
а также Seed
всегда будет производить одно и то же значение. Тем не мение, generate
также возвращает следующий Seed
будет использоваться в вашем следующем звонке 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: http://share-elm.com/sprout/55c766b4e4b06aacf0e8be1b
Надеюсь это поможет!
С помощью Random
супер легко в вязе 0,15. (Я предполагаю, что вы понимаете, как Elm естественным образом разделяет данные и код на модель, обновление и представление. Если ваше понимание архитектуры Elm шатко, прочитайте учебник The Elm Architecture и простое объяснение паттерна модель-представление-обновление).
Самая важная функция generate
, он возвращает пару: случайное значение и новое начальное число. Это новое семя, которое вы можете передать 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