程序包 org.hipparchus.random
随机数和随机数据生成器。
Hipparchus提供了一些伪随机数生成器。顶层接口是RandomGenerator。它由三个类实现:
JDKRandomGenerator
扩展了JDK提供的生成器- AbstractRandomGenerator作为用户生成器的辅助类
- BitStreamGenerator是几个生成器的抽象类,它又被以下类扩展:
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之间 |
因此,对于大多数模拟问题,像 Well19937c
和 Well44497b
这样的更好的生成器可能是非常好的选择。
请注意,这些生成器都不适用于密码学。它们专用于模拟,并生成具有整体强大属性的非常长的序列(均匀分布,无相关性...)。它们不试图创建具有密码学中所需的不可预测性非常强大属性的小序列。
-
类说明这个抽象类实现了François Panneton,Pierre L'Ecuyer和Makoto Matsumoto的WELL伪随机数生成器类。用于存储给定类型WELL伪随机数生成器的间接索引表的内部类。生成具有相关分量的向量的
RandomVectorGenerator
。这个类是标量的高斯归一化随机生成器。Halton序列的实现。一个快速的加密伪随机数生成器。将随机数生成委托给标准Random
类的RandomGenerator
适配器。这个类实现了由松本真和西村拓士在1996-1997年开发的强大的伪随机数生成器。这个接口表示标量的归一化随机生成器。RandomGenerator
的扩展,包装了一个Random
。RandomAdaptor类的测试用例。用于生成随机数据的类。RandomDataGenerator类的测试用例。随机数序列生成器的接口。用于RandomGenerator测试的基类。这个接口表示整个向量的随机生成器。Sobol序列的实现。这个类提供了一个稳定的归一化随机生成器。类StableRandomGeneratorTest
包含了类StableRandomGenerator
的测试。任何RandomGenerator
的实现都可以通过这个类的实例来实现线程安全。一个生成具有不相关分量的向量的RandomVectorGenerator
。这个类实现了一个归一化均匀随机数生成器。生成均匀分布在球面上的随机向量。这个类实现了来自François Panneton、Pierre L'Ecuyer和Makoto Matsumoto的WELL1024a伪随机数生成器。这个类实现了来自François Panneton、Pierre L'Ecuyer和Makoto Matsumoto的WELL19937a伪随机数生成器。这个类实现了来自François Panneton、Pierre L'Ecuyer和Makoto Matsumoto的WELL19937c伪随机数生成器。这个类实现了来自François Panneton、Pierre L'Ecuyer和Makoto Matsumoto的WELL44497a伪随机数生成器。这个类实现了来自François Panneton、Pierre L'Ecuyer和Makoto Matsumoto的WELL44497b伪随机数生成器。这个类实现了来自François Panneton、Pierre L'Ecuyer和Makoto Matsumoto的WELL512a伪随机数生成器。