Каково ожидаемое поведение 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
Другие вопросы по тегам