【发布时间】: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