0

我对生成具有固定分布的随机整数的函数的 C++ 实现有一些问题。为此,我实现了一个函数 urand(),它生成函数 random_integer() [它使用标准算法,我认为它在 Knuth 的 bool 之一中描述] 使用的 0 和 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[; 原位=1;u=2.77556e-17

现在有两件事我不明白: initu 应该严格小于 1(查看 while 循环的条件)。但即使假设它我

4

1 回答 1

4

我想你的意思是

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

不是

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

u不可能既小于或等于零又大于或等于一。

于 2012-10-17T00:34:32.453 回答