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