生成指数分布的随机数

#include  #include  #include  double ran_expo(lambda){ double u; u = rand() / (RAND_MAX + 1.0); return -log(1- u) / lambda; } 

我正在使用它(我没有在这里放置代码的其他部分)来生成指数分布lambda = 0.05随机数。 (概率密度函数是lambda * exp(-lambda * x) )。

但是,我总是得到非常小的数字,例如0.000041 ,或类似1.#INF00 (这是什么?)。

事实上,对于lambda = 0.05指数分布,生成的数字应该非常大,即大多数都不是30。我的结果非常奇怪。 另外,精度不尽如人意,仅为10 ^( – 6)。 我尝试了long double ,但它仍然是这样的。

我在windows下使用DEV C ++。

这是因为您没有声明lambda的类型,更正了结果在您寻找的范围内。 如果未声明,旧的编译器会认为它是int

 #include  #include  #include  #include  double ran_expo(double lambda){ double u; u = rand() / (RAND_MAX + 1.0); return -log(1- u) / lambda; } int main(void) { int i; srand((unsigned)time(NULL)); for (i=0; i<20; i++) printf("%f\n", ran_expo(0.05)); return 0; } 

节目输出:

 0.025040 16.582459 4.296027 33.079902 17.589123 13.073084 8.624299 45.254803 34.611211 27.454302 3.825699 39.168172 24.790600 14.411160 7.247698 0.301951 1.917010 9.065004 3.187146 3.627885 

我把你的代码逐字地抛给代码厨师 ,看起来它工作得很好。 编译器是gcc c ++ 4.9.2。 此代码打印出36.6751

 #include  #include  #include  #include  using namespace std; double ran_expo(double lambda){ double u; u = rand() / (RAND_MAX + 1.0); return -log(1- u) / lambda; } int main() { cout << ran_expo(0.05); return 0; } 

在C中也以相同的方式工作(同样,gcc 4.9.2):

 #include  #include  double ran_expo(double lambda){ double u; u = rand() / (RAND_MAX + 1.0); return -log(1- u) / lambda; } int main() { printf("%f\n", ran_expo(0.05)); return 0; } 

必须是你的编译器/库?