程序包 org.hipparchus.random


package org.hipparchus.random

随机数和随机数据生成器。

Hipparchus提供了一些伪随机数生成器。顶层接口是RandomGenerator。它由三个类实现:

JDK提供的生成器是一个简单的生成器,只能用于非常简单的需求。Mersenne Twister是一个快速生成器,具有非常好的性质,非常适合蒙特卡洛模拟。它是均匀分布的,可用于生成高达623维的向量,并具有巨大的周期:219937 - 1(这是一个梅森素数)。这个生成器在1998年由松本真和西村拓士在一篇论文中描述: Mersenne Twister: A 623-Dimensionally Equidistributed Uniform Pseudo-Random Number Generator,ACM Transactions on Modeling and Computer Simulation,Vol. 8,No. 1,1998年1月,第3-30页。WELL生成器是一系列生成器,其周期范围从2512 - 1到244497 - 1(最后一个也是梅森素数),具有比Mersenne Twister更好的性质。这些生成器在一篇由François Panneton,Pierre L'Ecuyer和松本真在2006年发表的论文中描述: Improved Long-Period Generators Based on Linear Recurrences Modulo 2,ACM Transactions on Mathematical Software,32,1(2006)。该论文的勘误在 wellrng-errata.txt中。

对于简单的抽样,任何这些生成器都足够了。对于蒙特卡洛模拟,JDK生成器没有其他生成器的良好数学性质,因此应该避免使用。Mersenne Twister和WELL生成器根据其位池大小证明了均匀分布的性质,这与它们的周期直接相关(它们都具有最大周期,即大小为n的池的生成器具有周期2n-1)。它们还具有对32位块的均匀分布性质,直到s/32维度,其中s是它们的池大小。因此,例如,WELL19937c在维度623(19937/32)上是均匀分布的。这意味着每次迭代生成一个n变量向量的蒙特卡洛模拟对向量的属性有一定的保证,只要其维度不超过限制。然而,由于我们使用两个连续的32位生成的整数的位来创建一个双精度数,当变量为双精度类型时,这个限制会更小。因此,对于每轮生成少于16个双精度数的蒙特卡洛模拟,WELL1024可能足够了。如果需要更多的双精度数,使用具有更大池的生成器会更有用。

WELL生成器比MersenneTwister更现代(描述它的论文于2006年发表,而不是1998年),并修复了一些它的(少数)缺点。如果初始化数组包含许多零位,MersenneTwister可能需要很长时间(几十万次迭代)才能达到稳定状态,其中位池中的零和一的数量平衡。因此,正如WELL生成器的创建者所解释的那样,WELL生成器更适合“逃离零地”。Well19937a和Well44497a生成器不是最大均匀分布的(即存在一些维度或位块大小,它们不是均匀分布的)。Well512a,Well1024a,Well19937c和Well44497b对于32位块的最大均匀分布(它们应该对基于超过32位块的双精度数也表现正确,但在这些块大小上的均匀分布没有得到证明)。

MersenneTwister生成器使用一个624元素整数数组,因此消耗不到2.5千字节。WELL生成器使用6个整数数组,大小等于池大小,因此例如WELL44497b生成器使用约33千字节。如果同时使用大量生成器实例,则这可能很重要。

所有生成器都非常快速。例如,在64位JVM上的linux计算机上,2008年处理器(AMD phenom Quad 9550,2.2 GHz),MersenneTwister的生成速率约为每秒2700万个双精度数(请记住,我们为每个双精度数生成两个32位整数)。其他PRNG的生成速率,相对于MersenneTwister:

性能示例
名称 生成速率(相对于MersenneTwister)
MersenneTwister 1
JDKRandomGenerator 介于0.96和1.16之间
Well512a 介于0.85和0.88之间
Well1024a 介于0.63和0.73之间
Well19937a 介于0.70和0.71之间
Well19937c 介于0.57和0.71之间
Well44497a 介于0.69和0.71之间
Well44497b 介于0.65和0.71之间

因此,对于大多数模拟问题,像 Well19937cWell44497b 这样的更好的生成器可能是非常好的选择。

请注意,这些生成器都不适用于密码学。它们专用于模拟,并生成具有整体强大属性的非常长的序列(均匀分布,无相关性...)。它们不试图创建具有密码学中所需的不可预测性非常强大属性的小序列。