哪种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