1

コードで乱数を生成する必要がありますが、現在のシナリオに基づいて Distribution のパラメーターを変更したいと考えています。アプリケーションは、シングルまたはマルチスレッド アプリケーションとして実行できます。

私の質問はRandomGenerator、クラスのコンストラクターでオブジェクトを初期化してから、そのRandomGeneratorオブジェクトを使用してNormalDistributionBetaDistributionまたはその他のオブジェクトを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);
        }
    }
}
4

1 に答える 1

0

RandomGenerator呼び出し全体を再利用する必要があります。さまざまな分布パラメーターでランダムな値を生成する最も簡単な方法は、パッケージRandomDataGenerator内のクラスを使用することです。random

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);
于 2015-04-13T20:28:46.143 に答える