哪个PRNG适合功能使用?

时间:2013-11-24 11:52:42

标签: 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的内部状态(称之为种子或其他),该方法返回所需的随机值加上修改后的状态。

我需要什么

最好是一个实现。但我可以自己轻松地做到这一点。使用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算法的某种比较?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:-1)

PRNG的非常好的评论和实施发表在Knuth, TAOCP,Vol。 2,C.3。