固定分布でランダムな整数を生成する関数の 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 ループの条件を見てください)。しかし、それが私であると仮定しても