生成指数分布的随机数
#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; }
必须是你的编译器/库?