【问题标题】:Elm seed for Random.initialSeed - prefer current time [duplicate]Random.initialSeed 的榆树种子 - 更喜欢当前时间 [重复]
【发布时间】:2016-02-13 18:11:24
【问题描述】:

简单的方法是什么?

Random.initialSeed 的文档说:

"A good way to get an unexpected seed is to use the current time." 

http://package.elm-lang.org/packages/elm-lang/core/2.1.0/Random#initialSeed

经过大量阅读,我只能找到远远超出我对 Elm 和函数式编程的理解的“解决方案”。他们似乎也不是这个问题的解决方案。

我目前正在硬编码:

Random.initialSeed 314

如果您使用库,请包含用于从 elm 包中获取它的名称。我看到了一个解决方案,上面写着使用Native.now,但我不知道如何获得它。

stackoverflow 建议使用这个,但我不明白如何将它应用到我的用例 Elm Current Date

【问题讨论】:

  • 使用端口获取当前时间。在这里查看答案:stackoverflow.com/questions/35235708/elm-generate-random-number
  • @robertjlooby 谢谢!这最终是我所见过的最简单的方法。您链接到的答案很好地展示了最少的代码。在看到之前我也不知道如何创建自己的 html(我的是由 elm-make 生成的)。
  • 基于此线程,我按照建议将我的问题标记为重复。

标签: elm


【解决方案1】:

你可以试试How do I get the current time in Elm?case nelson 的回答

来自 elm repl:

> import Now
> import Random
> Now.loadTime |> round -- get current time in Int
1455406828183 : Int
> Now.loadTime |> round |> Random.initialSeed -- get the Seed
Seed { state = State 1560073230 678, next = <function>, split = <function>, range = <function> }
: Random.Seed

我的 repo 上也有代码 here

注意:不要忘记"native-modules": true 中的elm-package.json

编辑:

尝试代码,

  1. git 克隆https://github.com/prt2121/elm-backup.git
  2. cd elm-backup/现在
  3. elm make Now.elm
  4. elm-package.json 中添加"native-modules": true
  5. 榆树复制

【讨论】:

  • 我需要安装什么来获得 Native.Now?榆树说“我找不到模块‘Native.Now’。”。当我尝试您链接到的答案时,这就是阻止我的原因。我查看了您的存储库,但它当然不会告诉我您是否运行了“elm package install X”。我确实有“native-modules”:是的——我把它放在 elm-package.json 的哪个位置有关系吗?
  • @samspot 该模块未公开发布。看我的更新。谢谢!
  • 谢谢,我认为这是官方的 - 现在更有意义了。
【解决方案2】:

我能想到的最简单的方法是使用 Elm 架构和Effects.tick 机制来用时间值初始化种子。

这是一个如何工作的示例:

import Html exposing (..) 
import Html.Events exposing (onClick) 
import Random exposing (Seed, generate, int, initialSeed)
import Time exposing (Time)
import Effects exposing (Effects, Never) 
import Task exposing (Task)
import StartApp 

type alias Model = { seed : Seed, value : Int} 

type Action = Init Time | Generate

init : (Model, Effects Action) 
init = (Model (initialSeed 42) 0, Effects.tick Init) 

modelFromSeed : Seed -> (Model, Effects Action) 
modelFromSeed seed =
  let 
    (value', seed') = generate (int 1 1000) seed
  in 
    (Model seed' value', Effects.none)

update : Action -> Model -> (Model, Effects Action) 
update action model =
  case action of 
    Init time -> 
      modelFromSeed (initialSeed (round time))
    Generate -> 
      modelFromSeed model.seed


view : Signal.Address Action -> Model -> Html 
view address model =
  div []
  [ text ("Current value:  " ++ (toString model.value))
  , br [] []
  , button [onClick address Generate] [text "New Value"]
  ]

app : StartApp.App Model   
app = StartApp.start 
  { init = init
  , update = update
  , view = view
  , inputs = []
  }


main : Signal Html
main = app.html

port tasks : Signal (Task Never ())
port tasks = app.tasks

【讨论】:

    猜你喜欢
    • 2016-03-09
    • 1970-01-01
    • 2016-09-13
    • 2016-01-14
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 2016-09-24
    • 2011-05-13
    相关资源
    最近更新 更多