0

固定分布でランダムな整数を生成する関数の C++ 実装に問題があります。これを行うために、関数 random_integer() によって使用される 0 と 1 の間で均一に分散された (含まれている) double を生成する関数 urand() を実装しました [これは標準アルゴリズムを使用します。Knuth の bool の 1 つで説明されていると思います]。関数は次のように実装されます。

double urand(){
int r =rand(); ;
return ((double) r)/RAND_MAX ;
} ; // uniform random number between 0 and 1 (included);


int random_integer(std::vector<double> &p_vec) {
unsigned int n_events=p_vec.size();
double u;
double initu;
do{
    u=urand();
}while(u<=0 && u >=1);
// chose a random number uniformly distributed between 0 and 1 (excluded)
initu=u;
for (unsigned int i=0; i<n_events; i++){
    if (u<=p_vec[i]) return i;
    u-=p_vec[i];
}
cout << "Warning: get_random_event() [utilities.cpp] could not find a suitable event. Returning -1 instead.\n";
cout << "p_vec=[" ; print(p_vec); cout << "]; "; // print is just a function that displays the elements in a vector;
cout << "initu=" << initu << "; u=" << u << endl;
return -1 ;
 }

ほとんどの場合、すべて正常に動作しますが、たとえば、次のような警告が表示されました。

警告: get_random_event() [utilities.cpp] は適切なイベントを見つけられませんでした。代わりに -1 を返します。p_vec=[0.08;0.42;0.42;0.08[; initu=1; u=2.77556e-17

ここで、私が理解できないことが 2 つあります。 initu は厳密に 1 未満でなければなりません (while ループの条件を見てください)。しかし、それが私であると仮定しても

4

1 に答える 1

4

私はあなたが意味したと思います

}while(u<=0 || u >=1);

いいえ

}while(u<=0 && u >=1);

uゼロ以下と 1 以上の両方になることはできません。

于 2012-10-17T00:34:32.453 に答える