【问题标题】:How can I get a random value in a range determined by a signal?如何获得由信号确定的范围内的随机值?
【发布时间】:2014-01-26 06:20:35
【问题描述】:

首先是一些代码:

import Random
import Window

writeRandom x = lift asText (Random.range 0 x <| every second)

upperLimit = 300
-- upperLimit = Window.width -- How can i use this instead?

main = writeRandom upperLimit

最终我试图在屏幕上获取随机点,但我不知道如何将 Window.height 和 Window.width 传递给 Random.range。我认为我不能“提升”Random.range,因为它已经返回了一个信号。如果我尝试我会收到类型错误:

Type Error: 'main' must have type Element or (Signal Element).
Instead 'main' has type:

   Signal (Signal Element)

而且我不确定是否存在升力的反面(更低?),甚至是否有意义。

谢谢

【问题讨论】:

    标签: random elm


    【解决方案1】:

    您认为 lower 的反义词没有意义是正确的。
    在这种特殊情况下,内置的 Random 库是内置的,因为它是原生 JavaScript 调用的包装器。这就是Signal 返回类型的原因,以保持代码纯净。即便如此,它还是not completely well-behaved

    要获得所需的随机范围,您需要使用不同的随机数生成器。几天前发布了一个community library,它可能会满足您的需求。你可以自己在 GitHub 上查看,或者useelm-get 工具。

    您的代码将变成类似 (untested!):

    import Window
    import Generator
    import Generator.Standard as GStd
    
    randomSeed = 12346789
    
    writeRandom : Signal Int -> Signal Element
    writeRandom x = 
      let update high (_, gen) = Generator.int32Range (0,high) gen
          start = (0, GStd.generator randomSeed)
          input = sampleOn (every second) x
          result = fst <~ foldp update start input
      in  lift asText result
    
    upperLimit = Window.width
    
    main = writeRandom upperLimit
    

    writeRandom 中,您使用foldp 来保留最新的随机数生成器。在update 中,您使用它来获取新的随机数和下一次的新生成器。 x 的输入使用sampleOn (every second) 每秒更新一次。 fst &lt;~ 部分是删除随机数生成器,因为您只想要随机数。

    【讨论】:

    • 感谢您的回复。我会尽快试用。
    • 它有效。我花了几天时间来设置我的环境来测试它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 2022-11-13
    • 1970-01-01
    • 2010-11-02
    • 2017-10-16
    相关资源
    最近更新 更多