2014-05-01 61 views
0

傳統上,如果我想選擇發生25%的情況,我使用「arc4random()%」函數以整數觸發1/4機會的情況。 現在我有4個浮動利率的情況。比方說,如何通過自定義編號創建隨機選擇器?

一0.3055

乙0.391

Ç0.165

d 0.1485

A + B + C + d = 1

我怎樣才能建立一個隨機選擇器通過正確選擇觸發4的情況?當然,案例B獲得最多機會被選中。

非常感謝

+0

我張貼解決類似的問題在這裏,http://stackoverflow.com/questions/13635448/generate-隨機數中之範圍與 - 不同-概率/ 13637027#13637027。 – user515430

回答

1

通過與從均勻分佈適當的概率選擇。

int myOwnFunkyDistribution(void) 
{ 
    uint32_t A = 0.3055 * UINT32_MAX; 
    uint32_t B = A + 0.3910 * UINT32_MAX; 
    uint32_t C = B + 0.1650 * UINT32_MAX; 

    uint32_t r = arc4random(); 

    if (r < A) 
     return 0; 

    if (r < B) 
     return 1; 

    if (r < C) 
     return 2; 

    return 3; 
} 

隨着越來越多的情況下,這是絕對使用陣列和for循環進行重構

0

你想做一個多項式樣本。您可以在iOS中使用GSL或其他基於C或C++的統計信息庫。

2

我不認爲這是完美的,但它會得到您關閉

int probability = arc4random_uniform(10000); 
    NSLog(@"Probability: %i", probability); 

    if (probability < 3055) { 
     // A 
    } 
    else if (probability <= (3055 + 3910)) { 
     // B 
    } 
    else if (probability <= (3055 + 3910 + 1650)) { 
     // C 
    } 
    else { 
     // D 
    } 
+0

'391'應該是'3910','165'應該是'1650'。 – rmaddy

+0

@rmaddy - 很好,謝謝! – Logan

+0

+1。僅僅是一點解釋:在上面的代碼中'概率'的概率將落入給定的範圍內(例如'概率<3055','概率<= 3055 + 3910'等等)與該範圍的長度相對於總數成正比長度(10000)。並且每個範圍的相對長度由其概率乘以10000給出(例如3055 = 0.3055×10000)。 – bytefire