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中的一些实现。