2013-10-12 48 views
0

我在C++中構建了一個模擬器,並且我有一個指數生成器來創建進程的突發時間。指數發生器有時會給出「奇怪」的結果

通常它會返回值:3.14707,1.04998。但經常1/10場合,號碼轉出:2.64823e-307

這是發電機(我用srand (time(NULL));在節目的開頭)的代碼:

double exponential(float u) 
{ 
    double x,mean; 
    mean = 10; 
    // generate a U(0,1) random variate 
    x = rand(); 
    u = x/RAND_MAX; 
    return (-mean * log(u)); 
} 

這是怎麼我分配值。該while部分裏面是我的努力擺脫這樣的值,但沒有奏效:

for (int i = 0; i < nPages; i++) 
{ 
    index[i] = i; 
arrival[i]= poisson(r); 
burst[i]=exponential(u); 
while (burst[i]<1 || burst[i]>150) 
    { 
     cout<<"P"<<i<<endl; 
     burst[i]=(burst[i-1]+burst[i+1])/2; 
    } 
} 
+0

'float u'在'double exponential(float u)'中的作用是什麼。 你正在覆蓋它是有價值的。 –

+6

如果rand()返回0,該怎麼辦? (['log(0)'返回'HUGE_VAL'](http://en.cppreference.com/w/cpp/numeric/math/log)) – dyp

+1

如果rand()返回RAND_MAX或close到它?你返回'0'或接近它。 – David

回答

0

如果爆裂的大小NPAGES,然後

for (int i = 0; i < nPages; i++) 
{ 
    //... 
    burst[i]=(burst[i-1]+burst[i+1])/2; 
} 

將其邊界以外的步驟,所以你很可能最終會胡說八道。 你需要考慮邊緣需要什麼。

至於有關rand轉到rand considered harmful的意見值得一看。在你的情況下取0的記錄是不明智的。

3

爲什麼使用C庫而不是C++庫?

std::random_device rd; 
std::default_random_engine gen(rd()); 
std::exponential_distribution<double> dist(lambda); 

double x = dist(gen); 
+0

如果他沒有C++ 11支持,該怎麼辦? – LihO

+0

我會對此結果,如果我不能做任何其他的,謝謝 –

+0

@LihO然後,他應該這樣說。這個問題提到C++和現行標準(2011)已有兩年曆史,主要由大多數編譯器(當前版本)實現。故意將自己限制在2003年的標準是不合情理的。 – Walter

0

使用你的exponential函數複製逐字,我不能重現你描述的錯誤。 PRNG啓動0或RAND_MAX的問題應該只顯示一次出現RAND_MAX,而不是10%的時間。我懷疑是一個錯誤的編譯器,或者你分享的東西不是產生所描述問題的實際代碼。