2

もう一度お邪魔して申し訳ありませんが、私は新しい C++ であるため、奇妙でばかげた問題がたくさんあります。

MCMC メソッドをプログラミングしています。このフォーラムで、WELL RNGが乱数を生成するための優れた代替手段であると読んだので、それを機能させようとしています。だからここに質問があります:

  1. C++ プロジェクト内の "Well44497a.c" をさらに変更せずにコンパイルしています。コンパイルした。そうですか、それとも何か変更を加える必要がありますか?

  2. コード内で次のスキームを使用していますが、3 RN のサイクルを生成しているだけです

解決済み: InitWELLRNG44497a(state) を関数の外に配置する必要があるという問題がありました。サンプルを生成するたびに、ジェネレーターを再起動していました。実行全体で、ジェネレーターを一度だけ初期化する必要があります。

    int* sampler(PARAMETERS) { //this function returns a sample

    int k;

    unsigned int state[1391];

    for (k = 0; k < 1391; ++k) 
    {
        state[k] = k;
    }

    InitWELLRNG44497a(state); //THIS SHOULD GO ON THE CALLER FUNCTION NOT HERE

    double value_first = valuate(first_state); // this function valuates one of two possible states
    double value_second = valuate(second_state); 

    double rand_number = WELLRNG44497a()

    if(rand_number > value_first / (value_first + value_second))
       return second_state;
    else
       return first_state;
    }        
4

1 に答える 1

1

state関数は、関数を呼び出すたびに同じ値で配列を初期化するように見えますsampler()。配列の考え方はstate、乱数ジェネレーターの現在の状態を保持しstate、RNG への呼び出しの間に の内容をいじらないことです。

stateプログラムで配列をグローバルにし、一度初期化して、初期化後に触れないでください。

于 2011-04-25T09:50:52.853 に答える