如何在信号确定的范围内获得随机值?

时间:2014-01-26 06:20:35

标签: random elm

首先是一些代码:

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)

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

由于

1 个答案:

答案 0 :(得分:3)

你认为与较低的相反没有意义是正确的 在这种特殊情况下,内置随机库是内置的,因为它是本机JavaScript调用的包装器。这是Signal返回类型的原因,以保持代码纯。即便如此,它还是not completely well-behaved

要获得所需的随机范围,您需要一个不同的随机数生成器。有一个community library仅在几天前发布,可能会满足您的需求。您可以自行查看GitHub,或use elm-get工具。

您的代码会变得类似(未经测试!):

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 <~部分是删除随机数生成器,因为您只需要随机数。