哪种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算法的一些比较?


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

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


你最简单的赌注是梅森扭转者。 它广泛用于财务分析和蒙特卡洛模拟,我甚至在一些赌博服务器上看到它。 这也是很多语言的默认PRNG。

这里有一个非常清晰/好评的Mersenne Twister的实现 。 它是用Java编写的,但是Scala翻译应该是快速的,而且更好但是没有必要。

这是一个Scala实现。


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

链接地址: http://www.djcxy.com/p/37303.html

上一篇: Which PRNG is suited for a functional usage?

下一篇: dependent PRNG