2012-08-02 72 views
3

我想要一個指數分佈變量,它似乎相當有效的事:隨機數(0,1)在C

double exp_variate(double lambda){ 
    return -log(my_random_function())/lambda; 
} 

其中my_random_function給出了一個雙X,所以0 < x < 1(嚴格),意思是我千萬不要得到-log(0)0。我將如何獲得排除0和1值的隨機數字。我確信有人會問這個,但我看不到它。另外,我願意用其他方式來生成指數分佈的值。

編輯:>到<

+2

如何明確檢查0或1並拒絕隨機數。 – 2012-08-02 01:21:34

回答

4

想必你的意思0 < x < 1,因爲一些不能同時小於0和大於1

在這種情況下,我可能會做這樣的事情:

double my_random_function() { 
    return (rand() + 1.0)/(RAND_MAX+2.0); 
} 

C的隨機數發生器通常產生從0到RAND_MAX的數字。這增加了隨機數發生器產生的值,所以它不能產生0.通過RAND_MAX + 1進行劃分會給我們從1/RAND_MAX到(RAND_MAX + 1)/(RAND_MAX + 1)的結果,所以後者因爲我們想避免這種情況,所以我們使用(RAND_MAX + 2),所以我們通過(RAND_MAX + 1)/(RAND_MAX + 2)得到1.0 /(RAND_MAX + 2),稍微大於0.0到只有不到1.0的東西。

+1

非常合理;或者在UNIX系統上使用'drand48' +拒絕採樣丟棄零。 – 2012-08-02 01:54:04

+1

除了'1.0 /(RAND_MAX + 2)'不完全作爲浮點數存在,所以得到的分佈不可能是一致的。斯蒂芬佳能的解決方案另一方面應該工作。 – 2012-08-02 02:08:35

+1

@R:我不知道你在做什麼。 *任何*轉換到範圍(0.0..1.0)必然有一些不一致。除2之外的任何主因子的分母不能精確表示。 RAND_MAX + 2.0並不比其他人更容易處理,除非RAND_MAX + 2.0超出了可精確表示的範圍。在典型情況下(32位RNG,64位雙精度型)不會如此 - 64位雙精度值有53位尾數,所以+/- 2 ** 53-1範圍內的數字都精確表示。 – 2012-08-02 02:56:17