2012-02-03 12 views
0

私のクエリはかなりシンプルです。私は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; 

} 
+0

それはあなたが* *持っているコードの問題が何であるかを完全には明らかではありません。 –

+0

私が持っているコードは、もう一方の変数を返すだけです。次のランダム変数が必要なときは、2つの均一なランダム変数をもう一度生成するという面倒な作業が必要です。今回は最後のように、私は1つのノーマルRVを得て、もう一方を投げ捨てます。 Javaでは、1つの標準変数を返し、次の呼び出しのために2番目の変数を保持します。だからあなたは仕事の半分をやる。これは私のアルゴリズムのいくつかが実行に数日かかるので、私の用途にとっては重要です。 – JJJ

答えて

3

だけnextGaussianValのその後値すなわち

static double nextGaussianVal; 

、静的としてnextGaussianValを宣言はnexで利用可能になりますメソッドが呼び出された時刻。あなたも現在のカウントに追いつくために、別の静的変数が必要な場合がありますので、同じよう:

double nextGaussian() 
{ 
    static int count = 0; 
    static double nextGaussianVal; 
    double firstGaussianVal, v1, v2, s; 

    if (count == 0) { 
     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); 
     nextGaussianVal = v2 * multiplier; 
     firstGaussianVal = v1 * multiplier; 
     count = 1; 
     return firstGaussianVal; 
    } 

    count = 0; 
    return nextGaussianVal; 
} 

編集:より詳細な説明 - 関数が呼び出される初めて、カウントがゼロに初期化されます。 if文に基づき、問題の計算が行われ、は1の値が割り当てられ、firstGaussianValnextGaussianValに値が割り当てられていることを想定して、firstGaussianValが返されます。 カウントには、前に割り当てられた値が1つあり、nextGaussianValには、最初の呼び出しで割り当てられた値が入ります。つまり、カウントが1になり、関数は、ステートメントの場合に基づいて、カウントに0を割り当て、を返します.GaussianVal。リンス、繰り返し...

+0

私はその問題に対処するとは思わないが、私は間違っている可能性があります。関数が未使用の変数をいつ返すか、実際にDOコマンドをいつ実行するかは分かりません。より具体的になりますか? – JJJ

+0

2回目の呼び出しでは、IF ELSEツリーに到達する前に0に戻されないため、ELSEパートに到達できませんでしたか? – JJJ

+0

いいえ、静的変数宣言のゼロは、実際には静的であるため、メソッドが呼び出されたときに初めて割り当てられます。 – hatboyzero

-1

上記の提案の問題は、COUNT変数が整数ではなく、ブール値であることです。さらに、格納されたガウス関数もまたSTATICである必要があります。

私が望む正しい解決策に私が手伝ってくれたことに皆様のおかげで感謝したいと思います。私はこのスニペットがオブジェクトに属していることを認識しています。私は今、1つのファイルに保存する理由があります。

double nextGaussian() { 

    // Static variables allow the function to make use of 
    // both Gaussian Random variables. Generated by the polar Marsaglia 
    // method This makes the function much more efficient with will 
    // pay off for simulations 

    static bool hasNextGaussian = false; 
    static double nextNextGaussian; 
    double v1, v2, s; 

    if (!hasNextGaussian) { 

     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; 
     hasNextGaussian = true; 
     return v1 * multiplier; 

    } else { 

     hasNextGaussian = false; 
     return nextNextGaussian; 

    } 

} 

ダブルnextUniform(){

double Uniform = rand()/double(RAND_MAX); 
return Uniform; 

}

+0

カウント変数の代わりにブール値を使用していることを除けば、これは上で示唆したものとどのように機能的に違いますか?私はまだ、上記の例がどのように*動作していなかったかを理解するのが難しいです(nextUniform()の定義がどちらの場合も同じであったと仮定して)。 – hatboyzero

+1

ちょっと不思議ですが、答えはコードの大きな問題を解決することを暗示しています...あなたの質問で完全に説明/参照されていないようです。これは物事を少し混乱させます。ここであなたの質問を拡大して、ここに欠けている部分を明らかにしてもらえますか?私は完全に思考の列車を完全に見たいと思う。ありがとう。 – skyburner

+0

私が懸念している限り、固執点は、あなたがどの状態にいるかを管理するために整数かブール値を使用しているかどうかは関係ありません。両方の例で説明されている動作は**同一でなければなりません**。 Trueは1と同じで、Falseは0と同じであり、**(!hasNextGaussian)**は**(count == 0)**と同じ結果を返します。 – hatboyzero

関連する問題