Random Elm-生成随时间变化的随机数列表

Random Elm-生成随时间变化的随机数列表,random,signals,elm,Random,Signals,Elm,我试图使一列随机数每秒都发生变化,但收到不同的错误消息: 随机导入 主=向下流动 [asText(随机范围0.100(每秒)) ,asText(随机范围0.100(每秒)) ] 给出一个分析错误。我的方括号有什么问题 Parse error at (line 5, column 1): unexpected '[' expecting newline, spaces or end of input 也许是缩进? 缩进后,示例将编译,但我只得到,而不是实际的数字 main=向下流动 [asT

我试图使一列随机数每秒都发生变化,但收到不同的错误消息:

随机导入
主=向下流动
[asText(随机范围0.100(每秒))
,asText(随机范围0.100(每秒))
]
给出一个分析错误。我的方括号有什么问题

Parse error at (line 5, column 1):
unexpected '['
expecting newline, spaces or end of input

也许是缩进? 缩进后,示例将编译,但我只得到
,而不是实际的数字

main=向下流动
[asText(随机范围0.100(每秒))
,asText(随机范围0.100(每秒))
]

提升
信号? 最后,当我试图使用
lift
时,它给了我其他的困惑

main=向下流动
[提升asText(随机范围0 100(每秒))
,提升asText(随机范围0.100(每秒))
]
错误消息是我的
lift
类型错误

Type error on line 5, column 5 to 9:
       lift

  Expected Type: Signal Element
    Actual Type: Element

没有
向下流动
只是一个列表 如果我忘记了向下流动,它仍然不合作:

main=lift asText
[(随机范围0.100(每秒))
,(随机范围0.100(每秒))
]
我收到一条错误消息,该消息应为
\u List

Type error between lines 5 and 7:
       [Random.range 0 100 (every second),
        Random.range 0 100 (every second)]

  Expected Type: _List
    Actual Type: Signal

? 我是否正确使用了
Random.range


我如何让它与
提升
向下流动
配合?

这里发生了一些事情:

正如您所期望的,在第一部分中,您遇到了一个编译器不喜欢的缩进问题

下一个例子之所以有效,是因为列表中的两个东西实际上是信号。但是,这不是您想要的。相反,您想要打印出符号

下面是一个简单的提升
随机范围的示例:

import Random

main = asText <~ (Random.range 0 10 (every second))


希望这有帮助!

以下是一个适用于0.15[编辑:和0.16]的答案,目前是Elm的最新版本。自从Joe的答案被写出来后,随机库已被彻底检修,以使用纯随机数生成器。伪随机数是确定性的:除非更改初始种子,否则每次运行都是相同的

我们从导入开始:无聊但必要,然后使用随机库定义一些常量

import Graphics.Element exposing (flow, down, show, Element)
import Time exposing (fps)
import Random

gen = Random.int 0 100
gen2 = Random.pair gen gen
seed0 = Random.initialSeed 42
接下来,我们定义一个状态类型,包含随机种子和要显示的数字。我假设我们需要两个;对于长度恒定的列表,请使用
random.list n gen
。我们还使用记录构造函数语法(和两个“random”数字)定义初始状态

现在,我们定义了一个每秒运行一次的步长函数。在这里,我们剥离两个随机数并将它们与新种子一起存储。请注意,我们每次都使用一个新种子,将一个种子链接到下一个种子

step : a -> State -> State
step _ state =
  let
    ((first, second), seed') = Random.generate gen2 state.seed
  in
    State seed' first second
现在我们使用
foldp
引入状态,以实际运行该步骤函数

state : Signal State
state = Signal.foldp step state0 (fps 1)
我们定义了一个纯渲染函数,这里没有信号

render : State -> Element
render state =
    flow down [show state.first, show state.second]
最后,我们将渲染函数映射到状态

main = Signal.map render state

如果您连接灰色框并删除中间注释,您将得到一个正常工作的Elm 0.15程序。但请注意,它似乎是CPU密集型的。

也许您应该提到
(另外,如果您担心非随机的起始值,请定义
state0=State seed0 |>step()
)。
render : State -> Element
render state =
    flow down [show state.first, show state.second]
main = Signal.map render state