Как я могу получить случайные числа в вязе 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
это не компилируется. Итак, как мне получить сигнал в этой функции, чтобы получить случайные числа... Я не могу найти решение, это сводит меня с ума.
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
,