2011-10-31 85 views
2

隨機數,只是想知道這是什麼類型的算法,
或者,如果有一個更簡單/更有效的方式去了解這一點:具有非均勻離散密度

說我們是給予一定的概率密度,說

prob[] = {.1, .15, .25, .05, .45} 

組1 - 10%
第2組 - 15%
第3組 - 25%
組45%
第5組 - 45 %

和隨機數,(0,1),
跑= 0.853234

插入進5組中的一個

if (ran <=prob[0]) selection = 1; 
else if (ran <= prob[0]+prob[1]) selection = 2; 
... 
else if (ran <= prob[0]+prob[1]+...+prob[4]) selection = 5; 

我不是隨機數非常精通代

回答

2

你基本上在這裏做的是顛倒cumulative distribution function。令F爲具有給定分佈的隨機變量X的CDF,則其被定義爲F(x) == P[X <= x]

這裏的非常有用的東西,是,如果你產生0和1之間的均勻隨機變量U,然後

P[F^-1(U) <= x] == P[U <= F(x)] == F(x) == P[X <= x] 

這意味着F^-1(U)將具有相同的分佈X

當然這隻有在您可以反轉CDF時纔可能,但在您的情況下,F是分段函數(如樓梯),並且對於給定的統一值,您的算法會確定在哪個步驟中滿足此值。因此你的算法是完全正確的。

但是,你可以改善它,如果你有大量的隨機數的產生:首先生成CDF表,而你的情況是

CDF[] = {.1, .25, .5, .55, 1.} 

然後在0和1之間的每個生成統一編號,只需在CDF表上執行二分法即可回溯相應的指數。

1

你的算法是正確的。在你的例子中,概率不等於1.

0

這段代碼將起作用,只是你的概率不會加起來爲100%(所以if語句沒有可能匹配) 。

該方法可以使用累積概率分佈可以簡化一下:

cumprob[5] = {.1, .2, .45, .50, 1.0}; 

這也可以讓你代替lsearch爲IF-ELIF鏈。

0

您的算法對離散分佈使用隨機浮點數,這不是實現此目的的最佳方式。您的實施可能會提供與給定分佈幾乎沒有區別的分佈,但它在科學上不正確。

取而代之,找到給定概率的最小公分母(在您的示例中爲5%),並使用[0,19]中的隨機整數來選擇您的組。例如:

switch(random(19)) { 
case 0: 
case 1: 
    selection = 1; 
    break; 
case 2: 
case 3: 
case 4: 
    selection = 2; 
    break; 
case 5: 
case 6: 
case 7: 
case 8: 
case 9: 
    selection = 3; 
    break; 
case 10: 
    selection = 4; 
    break; 
case 11: 
case 12: 
case 13: 
case 14: 
case 15: 
case 16: 
case 17: 
case 18: 
case 19: 
    selection = 4; 
    break; 
}