2016-01-01 171 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; 
} 

必須是你的編譯器/庫?