在 Apache Commons Math 的程序流程中更改分布参数
Changing distribution parameters during program flow in Apache Commons Math
我需要在我的代码中生成随机数,但我想根据当前情况更改 Distribution 的参数。该应用程序可以 运行 作为单线程或多线程应用程序。
我的问题是,我是否应该在 class 的构造函数中初始化 RandomGenerator
对象,然后使用该 RandomGenerator
对象(重新)初始化 NormalDistribution
、BetaDistribution
或 AbstractRealDistribution
的任何其他对象,或者在我需要更新参数后初始化我的分布对象。
就生成好的随机数和最优性而言,哪个更好?
案例一:
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);
}
}
}
案例二:
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
class:
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);
我需要在我的代码中生成随机数,但我想根据当前情况更改 Distribution 的参数。该应用程序可以 运行 作为单线程或多线程应用程序。
我的问题是,我是否应该在 class 的构造函数中初始化 RandomGenerator
对象,然后使用该 RandomGenerator
对象(重新)初始化 NormalDistribution
、BetaDistribution
或 AbstractRealDistribution
的任何其他对象,或者在我需要更新参数后初始化我的分布对象。
就生成好的随机数和最优性而言,哪个更好?
案例一:
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);
}
}
}
案例二:
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
class:
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);