如何在Elm中的给定列表中获取随机元素?

Mis*_*hko 1 random elm

我正在构建一个滑动益智游戏:

在此输入图像描述

从这个初始位置开始,我想把这个谜题改组,比如100步.

我希望每次都能以不同方式改组拼图.

这可能意味着Random.initialSeed每次我需要使用不同的号码进行呼叫,这意味着我需要使用类似当前时间的内容.

不幸的是,我找不到如何获得当前时间.

在每个给定的状态中,我都列出了可能的动作.例如,在上面的初始位置:[MoveRight, MoveDown]

所以,基本上,我的问题是:如何在给定的List中获取随机元素?

share-elm的例子将不胜感激.

mgo*_*old 6

这是对pdamoc答案的修订.它更紧密地遵循榆树建筑,但更重要的是,它保存了从按压到印刷的随机种子.如果你继续使用初始种子,你就不会得到随机性.我只得到了其他版本的偶数或奇数(得到了均衡,刷新,得分).Random.initialSeed在程序中只调用一次是很重要的,通常是在初始模型的定义中.

还有一个库(我写的)处理Arrays上的随机操作.

import Html exposing (..) 
import Html.Events exposing (onClick) 
import Random exposing (initialSeed, int, generate, Seed)

type alias Model = 
  { list : List Int , currentElement : Maybe Int, seed : Seed}

init : Model 
init = {list = [1..10], currentElement = Nothing, seed = initialSeed 42 } 

type Action = NoOp | Click

actions : Signal.Mailbox Action
actions = Signal.mailbox NoOp

update : Action -> Model -> Model
update action model =
  case action of
    NoOp -> model
    Click ->
      let gen = Random.int 0 (List.length model.list - 1)
          -- since we know the list is constant we don't have to
          -- redefine the generator every time, but we will anyway
          (i, seed) = Random.generate gen model.seed
          elem = List.drop i model.list |> List.head
      in {model| currentElement <- elem, seed <- seed}

model : Signal Model
model = Signal.foldp update init actions.signal

view : Signal.Address Action -> Model -> Html
view address model = 
  let 
    current = model.currentElement
              |> Maybe.map toString
              |> Maybe.withDefault "NONE"
  in 
    div [] 
      [ text  <| toString model.list
      , br [] []
      , text  <| "Current Element: " ++ current
      , br [] []
      , button [onClick address Click ] [text "Click for Random Element"]
      ]

main = Signal.map (view actions.address) model
Run Code Online (Sandbox Code Playgroud)