生成指数分布的随机数

时间:2016-01-01 17:17:12

标签: c

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

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 ++。

2 个答案:

答案 0 :(得分:5)

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

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

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

答案 1 :(得分:0)

我将您的代码 verbatim 投入code chef,看起来它运行正常。编译器是gcc c ++ 4.9.2。此代码打印出36.6751

#include <iostream>
#include <string>
#include <cstdlib>
#include <cmath>

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 <stdlib.h>
#include <math.h>

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;
}

必须是您的编译器/库吗?