2016-01-01 169 views
3
#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的指数分布,生成的数字应该相当大,即大多数不会太远。我的结果非常奇怪。另外,精度不够理想,仅为10 ^( - 6)。我试过long double,但它仍然是这样的。

我在Windows下使用DEV C++。

+1

什么是'lambda'的类型? –

+0

lambda是双重的 – Damien

+1

lambda在你的代码中不是双重的 –

回答

4

这是因为您没有声明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 
+0

谢谢! – Damien

+0

谢谢,我首先怀疑你的随机数范围(关注'log(0)'),但我看到你从'1'中减去。 –

+0

我的回答中有一个明显的错误。假设'int'是默认类型,并声明'int lambda',但我不知道它是什么。在第一种情况下,每个结果都是'-0.000000'。但是显式的'int'类型的每个结果都是'1.#INF00',就像你期望的那样,div0的结果(MSVC)。 –

0

我把你的代码逐字分成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; 
} 

必须是你的编译器/库?