1

我有一个 Java 模拟,我需要在其中使用UniformExponentialPoissonGamma分布 - 我需要用相同的种子初始化随机流和/或这些分布中的每一个(这样我就可以准确地再现给定固定种子的轨迹) .

我正在使用Parallel Colt(这是 Colt 的多线程版本)。

对于Uniform,我可以正确地播种一个DoubleUniform对象(从 导入之后cern.jet.random.tdouble.DoubleUniform):

int fixedSeed = 12345;
doubleUniformDist = new DoubleUniform (0.0, 1.0, fixedSeed);

但是,对于ExponentialPoissonGamma分布(都在cern.jet.random.tdouble),我不能通过传递fixedSeed- 来做同样的事情,因为它们希望DoubleRandomEngine传递一个对象:

构造函数摘要

Exponential(double lambda, DoubleRandomEngine randomGenerator)
构造负指数分布。

Poisson(double mean, DoubleRandomEngine randomGenerator)
构造泊松分布。

Gamma(double alpha, double lambda, DoubleRandomEngine randomGenerator)
构造 Gamma 分布。

有没有办法像我一样初始化这些(Exponential、、Poisson和) ?或者我应该实例化一个父/基类(如果是,如何?),所有这些类都从其中扩展?GammaUniformcern.jet.random.tdouble

笔记:

  1. 同样,我想要一个随机流(这样我的所有分布都可以使用该流中的随机数)——这对于可重复性非常重要。
  2. 一个示例模拟可能需要对这些分布进行数百万次(总共)采样 - 因此性能/速度始终是一个问题。
4

3 回答 3

0

全部,谢谢你 - 我把它修好了。看起来我之前得到的不同数字是由于我使用了staticNextDouble()方法 - 这不适合我的目的,因为staticNextDouble()使用随机数生成器的内部/默认种子,绕过了我提供的固定外部种子。

用 just替换staticNextDouble()调用后nextDouble(),我现在可以准确地重现给定固定外部种子的轨迹。

于 2017-04-14T23:45:12.313 回答
0

看起来DoubleMersenneTwister,它扩展了 DoubleRandomEngine,允许您在其构造函数中设置种子。

于 2017-04-04T23:18:31.713 回答
0

各种随机变量的生成以 Uniform(0,1) 随机数开始。ExponentialPoisson和的构造函数中的最后一个参数Gamma是为您提供 Uniform(0,1) 的源,它扩展了DoubleRandomEngine抽象类。看起来Parallel Colt 提供了六种这样的实现。您需要选择其中一个,为要生成的每个分发创建一个单独但种子相同的实例,然后使用DoubleRandomEngine您创建的实例之一构造每个分发对象。这样,底层的统一价值流将是相同的,并且可以适当地转换为您想要的分布。

这是一个相当简约的实现:

import cern.jet.random.tdouble.*;
import cern.jet.random.tdouble.engine.*;

public class RNG {
  public static void main(String[] args) {
    // create two instances of Mersenne Twister, seeded identically
    DoubleRandomEngine twister1 = new DoubleMersenneTwister(42);
    DoubleRandomEngine twister2 = new DoubleMersenneTwister(42);
    // print ten values from each, to show they produce identical U(0,1)'s'
    for(int i = 0; i < 10; ++i) {
      System.out.println(twister1.nextDouble() + ", " + twister2.nextDouble());
    }
    System.out.println("\nNow for some exponentials...\n");
    // instantiate two exponentials using our two twisters as the
    // underlying random engine
    Exponential exp1 = new Exponential(3, twister1);
    Exponential exp2 = new Exponential(3, twister2);
    // and print 10 of 'em to show they're synchronized.
    for(int i = 0; i < 10; ++i) {
      System.out.println(exp1.nextDouble() + ", " + exp2.nextDouble());
    }
  }
}

由于Exponential该类将提供的由“引擎”生成的制服流转换为指数 RV,并且制服是相同的种子,因此指数实际上是相同的种子。

于 2017-04-04T23:43:10.727 回答