私のクエリはかなりシンプルです。私はJavaで数値メソッドをコード化することを好むが、しばしばC++でいくつかのことを行う必要がある。私はMarsagliaアルゴリズムを使用しており、通常の確率変数を両方保持しているので、Javaのガウス確率変数が気に入っています。最初の呼び出しで1を返し、2番目の呼び出しで2番目の呼び出しを返し、3番目の呼び出しまで高価な計算を再度実行しません。下のoracleリンクを使用して(プログラムのコメント内で)、このコードをC++で実装しようとしましたが、C++バージョンの「Synchronized」パブリック・メソッドを作成して、両方の正規乱数変数を使用できるようにする方法はわかりません。私はプロのプログラマーではないので、どんな指導も大変ありがとうございます。Marsaglia C++の通常のランダム変数
私は維持したいと思います要するに:
V2 *乗数
// This function is Similar to the GNU
// Java Implementation as seen on
// http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Random.html#nextGaussian%28%29
double nextGaussian() {
double v1, v2, s, nextNextGaussian;
do {
v1 = 2 * nextUniform() - 1; // between -1.0 and 1.0
v2 = 2 * nextUniform() - 1; // between -1.0 and 1.0
s = v1 * v1 + v2 * v2;
} while (s >= 1 || s == 0);
double multiplier = sqrt(-2 * log(s)/s);
nextNextGaussian = v2 * multiplier;
return v1 * multiplier;
}
それはあなたが* *持っているコードの問題が何であるかを完全には明らかではありません。 –
私が持っているコードは、もう一方の変数を返すだけです。次のランダム変数が必要なときは、2つの均一なランダム変数をもう一度生成するという面倒な作業が必要です。今回は最後のように、私は1つのノーマルRVを得て、もう一方を投げ捨てます。 Javaでは、1つの標準変数を返し、次の呼び出しのために2番目の変数を保持します。だからあなたは仕事の半分をやる。これは私のアルゴリズムのいくつかが実行に数日かかるので、私の用途にとっては重要です。 – JJJ