Scala 哪种PRNG适合功能性使用?

Scala 哪种PRNG适合功能性使用?,scala,functional-programming,prng,Scala,Functional Programming,Prng,这个问题的动机是在Scala中使用PRNG,但答案很可能与语言无关 问题 我希望我的PRNG有一个功能接口。目前,我所知道的PRNG实现(Java stdlib、Scala stdlib、commons math)都是OO,因为PRNG是一个状态可变的对象。但我更喜欢纯功能性PRNG,主要有以下方法: def nextInt(state: S): (Int,S) 这里,S是PRNG的内部状态(称之为seed或其他),该方法返回所需的随机值加上修改后的状态 我需要什么 最好是实施。但是我自己可以

这个问题的动机是在Scala中使用PRNG,但答案很可能与语言无关

问题 我希望我的PRNG有一个功能接口。目前,我所知道的PRNG实现(Java stdlib、Scala stdlib、commons math)都是OO,因为PRNG是一个状态可变的对象。但我更喜欢纯功能性PRNG,主要有以下方法:

def nextInt(state: S): (Int,S)
这里,
S
是PRNG的内部状态(称之为seed或其他),该方法返回所需的随机值加上修改后的状态

我需要什么 最好是实施。但是我自己可以很容易地做到这一点。使用Java内置PRNG的一个非常简单的实现是:

def nextInt(state: Int): (Int,Int) = {
  val rng = new Random(state)
  (rng.nextInt(),rng.next())
}
或者更危险,更少浪费

def nextInt(state: Random): (Int, Random) = {
  val newRng = state.clone
  (newRng.nextInt(),newRng)
}
我真正需要的是一个高质量、小状态和快速计算的PRNG算法。Mersenne Twister的状态为600+字节。请注意,必须在每个步骤中复制状态。那么,有更小的吗


PRNG算法是否有一些比较?

非常好的PRNG回顾和实现,发表在第2卷,C.3中。

您不需要功能实现来获得功能接口


您可以将函数PRNG表示为Java PRNG或任何其他有状态PRNG生成的数字流。当您探索流时,它会自动调用Java PRNG并记住结果。

这不是您问题的答案,但我几周前在Twitter上问了一个相关问题,并被指出,它为Scala提供了一个纯功能性PRNG接口,为
Java.util.Random
提供了一种包装器。