【问题标题】:Stream of random values with Rng library带有 Rng 库的随机值流
【发布时间】:2014-12-08 15:40:01
【问题描述】:

我正在查看Rng 来源,以了解它们如何生成随机值流。

def stream[AA >: A](s: Size): Rng[EphemeralStream[AA]] = 
  list(s) map (EphemeralStream(_: _*))

首先我对这个签名感到困惑。我需要一个 infinite 流的生成器,它可以懒惰地产生随机值。所以我不需要size 参数。

我也对实现感到困惑。生成器似乎创建了一个列表,然后将其 convert 转换为流。然而,流的全部意义在于偷懒。我错过了什么?

【问题讨论】:

  • Stream 允许为固定大小。也许这种方法只允许创建固定长度的Streams,而不是无限的?
  • @lmm 是的,你是对的。我可能应该改写我的问题:如何使用Rng 编写随机值的无限流生成器?
  • 一定要使用Stream吗?我的理解是,对于新的开发,scalaz 鼓励人们使用Process,在这种情况下,编写一个输出无限Rng 随机值的过程相当简单。
  • 不,它没有。我希望写一个函数并不棘手:Rng[A] => Rng[Stream[A]].
  • 有点题外话,但很重要:在某些情况下,库可能没问题,您对随机数质量没有严格要求。然而,我强烈反对将其用于加密货币。我检查了他们如何生成数字。他们似乎没有为此目的使用任何现有的库。自定义实现可能带有一些侧通道,并且容易受到定时攻击。此外,我在 Google 上搜索了基于 Kleisli 的 RNG,但没有发现任何严重(甚至不严重)的推理,只是在 Scala 和 Haskell 中进行了一些实现。

标签: scala random stream scalaz


【解决方案1】:

我不知道 Stream,但我们可以使用 scalaz-stream Process 明确地做这样的事情:

def infiniteRandomProcess: Process[Rng, Int] =
  Process.await(Rng.int)({
    i => Process.emit(i) ++ infiniteRandomProcess
  })

然后你转换懒惰的Process,直到你得到你喜欢的run(或runLog等),你最终得到一个Rng值(或者可能是一个monad转换器将此与例如 Task) 结合起来。

API 可能允许将其转换为Stream;有很多,我倾向于留在浅层。

【讨论】:

    猜你喜欢
    • 2013-02-27
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 2016-04-30
    • 1970-01-01
    相关资源
    最近更新 更多