![](/img/trans.png)
[英]error: package org.apache.commons.math.distribution does not exist
[英]Changing distribution parameters during program flow in Apache Commons Math
我需要在代碼中生成隨機數,但是我想根據當前場景更改“分發”的參數。 該應用程序可以作為單線程或多線程應用程序運行。
我的問題是,我應該在類的構造函數中初始化RandomGenerator
對象,然后使用該RandomGenerator
對象重復(重新)初始化NormalDistribution
, BetaDistribution
或AbstractRealDistribution
任何其他對象,還是在需要后才初始化我的分發對象更新參數。
就生成良好的隨機數以及最優性而言,哪個是更好的選擇?
情況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.