簡體   English   中英

在Apache Commons Math中的程序流程期間更改分發參數

[英]Changing distribution parameters during program flow in Apache Commons Math

我需要在代碼中生成隨機數,但是我想根據當前場景更改“分發”的參數。 該應用程序可以作為單線程或多線程應用程序運行。

我的問題是,我應該在類的構造函數中初始化RandomGenerator對象,然后使用該RandomGenerator對象重復(重新)初始化NormalDistributionBetaDistributionAbstractRealDistribution任何其他對象,還是在需要后才初始化我的分發對象更新參數。

就生成良好的隨機數以及最優性而言,哪個是更好的選擇?

情況1:

class Test {
    protected RandomGenerator rng;
    public Test() {
        rng = new Well19937c();
    }
    private void someFunction(double mean, doube std_dev) {
        NormalDistribution norm = new NormalDistribution(this.rng, mean, std_dev);
        while (condition is met) {
            // do some calculation, create some random numbers, get new mean and std_dev
            norm = new NormalDistribution(this.rng, new_mean, new_std_dev);
        }
    }
}

情況2:

class Test {
    private void someFunction(double mean, doube std_dev) {
        NormalDistribution norm = new NormalDistribution(mean, std_dev);
        while (condition is met) {
            // do some calculation, create some random numbers, get new mean and std_dev
            norm = new NormalDistribution(new_mean, new_std_dev);
        }
    }
}

您應該在調用之間重用RandomGenerator 生成具有不同分布參數的隨機值的最簡單方法是在random包中使用RandomDataGenerator類:

RandomDataGenerator generator = new RandomDataGenerator(new Well19937c());
// Unit normal
double normDev = generator.nextGaussian(0, 1);
// mean = 0.5, std dev = 2
double normDev2 = generator.nextGaussian(0.5, 2);
// exponential, mean = 1
double expDev = generator.nextExponential(1);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM