Как получить случайные числа в Elm 0.13 без сигнала?

Я делаю игру, в которой мне нужно рисовать случайные линии на экране. Теперь похоже, что Random нужен сигнал для работы в 0.13 (а мы вынуждены работать в 0.13). Итак, как мне получить эти случайные числа?

Я начал со скелета игры, предоставленного на сайте elm-lang, и дошел до этого:

type UserInput = { space : Bool, keys : [KeyCode] }
type Input = { timeDelta : Float, userInput : UserInput }

userInput : Signal UserInput
userInput = lift2 UserInput Keyboard.space Keyboard.keysDown

framesPerSecond = 30

delta : Signal Float
delta = lift (\t -> t / framesPerSecond) (Time.fps framesPerSecond)

input : Signal Input
input = Signal.sampleOn delta (Signal.lift2 Input delta userInput)

gameState : Signal GameState
gameState = Signal.foldp stepGame defaultGame input

stepGame : Input -> GameState -> GameState
stepGame i g =
  if g.state == Start then *Get random floats*

Теперь в stepGame я хочу рисовать случайные линии. Проблема в том, что я могу получить случайные числа с плавающей запятой, только предоставив сигнал в 0,13. У меня есть входной сигнал рядом с функцией шага, но когда я меняю заголовок, скажем, на stepGame : Signal Input -> GameState -> GameState, он не компилируется. Итак, как мне получить сигнал в этой функции, чтобы получить несколько случайных чисел... Я не могу найти решение, это сводит меня с ума.


person Peter Raeves    schedule 21.12.2014    source источник


Ответы (1)


Есть два способа сделать это. Это действительно зависит от того, является ли количество случайных чисел, которое вам нужно, статическим или нет.

Статическое количество случайных чисел

Расширьте свой input случайными числами из Random.floatList:

type Input = { timeDelta : Float, userInput : UserInput, randoms : [Float] }

staticNoOfFloats = 42

input : Signal Input
input = Signal.sampleOn delta (Signal.lift3 Input delta userInput (Random.floatList (always staticNoOfFloats <~ delta)))

Динамическое количество случайных чисел

Используйте библиотеку сообщества (также описанную в этом ответе SO) под названием генератор. Вы можете использовать случайное начальное число, используя Random.range почти так же, как описано выше. Библиотека представляет собой чистый генератор псевдослучайных чисел, основанный на генерации случайного числа и нового Generator, который будет генерировать следующее случайное число.

Почему бы не использовать Random.floatList в динамическом случае?

Обычно, если вам нужно динамическое количество случайных чисел, это число зависит от текущего состояния программы. Поскольку это состояние фиксируется внутри foldp, где вы также выполняете обновление на основе этих случайных чисел, это делает невозможным использование «сигнальной функции», то есть чего-то типа Signal a -> Signal b.

person Apanatshka    schedule 21.12.2014