如何在 Elm 中随机生成一对花车?
How can I randomly generate a pair of floats in Elm?
我正在尝试创建一个 Random.Generator (Float, Float)
,其中第一个 Float
在某个范围内,比如说 0.0
1000.0
,第二个在 0.0
和第一个值。
有效值示例:(12.0, 5.0)
无效:(303.0, 800.0)
我查看了 Random.Extra 模块中的代码,但找不到解决方法。
下面的示例甚至无法编译。 :)
tuple =
let range = float 0.0 500.0
in flatMap (\max -> (max, float 0.0 max)) range
生成器代码如下:
floatTuple : Random.Generator (Float, Float)
floatTuple =
Random.float 0.0 1000.0
`Random.andThen`
(\val1 -> Random.map ((,) val1) (Random.float 0 val1))
以下是您如何使用它(在 0.17 中):
(tuple, nextSeed) = Random.step floatTuple initialSeed
您需要使用 Random.andThen
这是一个完整的工作示例(您可以将其复制并粘贴到 http://elm-lang.org/try)
import Html exposing (..)
import Html.App as App
import Random exposing (Generator, generate, float, map, andThen)
import Time exposing (every, second)
myPair : Float -> Float -> Generator (Float, Float)
myPair min max =
let
range = float min max
in
range
`andThen` (\f -> map ((,) f) (float min f))
type Msg = Request | Update (Float, Float)
update msg model =
case msg of
Request -> model ! [generate Update (myPair 0 1000)]
Update pair -> pair ! []
view model = text (toString model)
main =
App.program
{ init = (0,0) ! []
, update = update
, view = view
, subscriptions = (\_ -> every (2*second) (always Request))
}
我正在尝试创建一个 Random.Generator (Float, Float)
,其中第一个 Float
在某个范围内,比如说 0.0
1000.0
,第二个在 0.0
和第一个值。
有效值示例:(12.0, 5.0)
无效:(303.0, 800.0)
我查看了 Random.Extra 模块中的代码,但找不到解决方法。
下面的示例甚至无法编译。 :)
tuple =
let range = float 0.0 500.0
in flatMap (\max -> (max, float 0.0 max)) range
生成器代码如下:
floatTuple : Random.Generator (Float, Float)
floatTuple =
Random.float 0.0 1000.0
`Random.andThen`
(\val1 -> Random.map ((,) val1) (Random.float 0 val1))
以下是您如何使用它(在 0.17 中):
(tuple, nextSeed) = Random.step floatTuple initialSeed
您需要使用 Random.andThen
这是一个完整的工作示例(您可以将其复制并粘贴到 http://elm-lang.org/try)
import Html exposing (..)
import Html.App as App
import Random exposing (Generator, generate, float, map, andThen)
import Time exposing (every, second)
myPair : Float -> Float -> Generator (Float, Float)
myPair min max =
let
range = float min max
in
range
`andThen` (\f -> map ((,) f) (float min f))
type Msg = Request | Update (Float, Float)
update msg model =
case msg of
Request -> model ! [generate Update (myPair 0 1000)]
Update pair -> pair ! []
view model = text (toString model)
main =
App.program
{ init = (0,0) ! []
, update = update
, view = view
, subscriptions = (\_ -> every (2*second) (always Request))
}