Scala 带有Rng库的随机值流
我正在查看源代码,以了解它们如何生成随机值流Scala 带有Rng库的随机值流,scala,random,stream,scalaz,Scala,Random,Stream,Scalaz,我正在查看源代码,以了解它们如何生成随机值流 def stream[AA >: A](s: Size): Rng[EphemeralStream[AA]] = list(s) map (EphemeralStream(_: _*)) 首先,我对这个签名感到困惑。我需要一个无限流的生成器,它可以懒洋洋地生成随机值。因此,我不需要size参数 我也对实施感到困惑。生成器似乎创建了一个列表,然后将其转换为流。然而,这条流的全部意义在于懒惰。我遗漏了什么?我不知道流,但我们可以使用scal
def stream[AA >: A](s: Size): Rng[EphemeralStream[AA]] =
list(s) map (EphemeralStream(_: _*))
首先,我对这个签名感到困惑。我需要一个无限流的生成器,它可以懒洋洋地生成随机值。因此,我不需要size
参数
我也对实施感到困惑。生成器似乎创建了一个列表,然后将其转换为流。然而,这条流的全部意义在于懒惰。我遗漏了什么?我不知道
流
,但我们可以使用scalaz流流程
明确地执行类似操作:
def infiniteRandomProcess: Process[Rng, Int] =
Process.await(Rng.int)({
i => Process.emit(i) ++ infiniteRandomProcess
})
然后你转换惰性进程
,直到你得到你喜欢运行的东西(或者运行日志
等等),最后你得到一个Rng
值(或者可能是一个monad转换器,它将此值与任务相结合,例如任务
)
API可能允许将其转换为
流
;有很多,我倾向于停留在浅端。流允许固定大小。也许这种方法只允许创建固定长度的流,而不是无限长的流?@lmm是的,你是对的。我可能应该重新表述我的问题:如何使用Rng
编写无限随机值流的生成器?它必须使用流
?我的理解是,对于新的开发,scalaz鼓励人们使用Process
,在这种情况下,编写一个输出无限Rng
随机值的流程相当简单。不,它不是。我希望编写一个函数不会很棘手:Rng[a]=>Rng[Stream[a]]
。这有点离题,但很重要:在某些情况下,该库可能还可以,因为您对随机数的质量没有很强的要求。然而,我强烈反对将其用于加密。我已经检查了他们是如何生成数字的。他们似乎没有为此目的使用任何现有的图书馆。自定义实现可能附带一些副通道,并且容易受到(比如)定时攻击。此外,我在谷歌上搜索了基于Kleisli的RNG,没有发现任何严肃(甚至不严肃)的理由,只有Scala和Haskell中的一些实现。