2013-04-01 48 views
0

在一對夫婦最後一次申請的我本來是要實現概率這是通常一些項目中給出計算概率說:與給定的範圍

獎勵在一定程度上完成項目的用戶X

項目X可能的下面的一個:

jug => probability 25 
glass => probability 50 
plate => probability 20 
dish => probability 5 

我通過創建一個數組並填充所述特定項目的時間的概率是多少解決這一;對於上面的情況,我會有一個數組與25 elements of jug, 50 glasses and so on.。我最後shuffle {PHP}數組,並從中選擇一個隨機元素。

在另一個應用程序中,這些值總計超過了100,所以我首先從這個總數中計算出他們的尊重百分比,然後使用上面的邏輯。

只是想知道這是從這種結構計算概率的正確方法嗎?

我在這裏經歷了幾個關於特種部隊的問題,但沒有人幫助我解決問題。

如果有更合適的方式來做到這一點,請讓我知道

感謝

回答

3

您可以簡單地指定以下值:

$jug = 25; 
$glass = 25+50 = 75; 
$plate = 75+20 = 95; 
$dish = 95+5 = 100 

然後獲得一個隨機的100,並確定它適合,類似於下面的

$jug = 25; 
$glass = 75; 
$plate = 95; 
$dish = 100; 
$items = {"jug", "glass", "plate", "dish"}; 

$rand = random(100); // Get a random number between 0 and 100 

if ($rand < $jug) { 
    return items(0); 
} elseif ($rand < $glass) { 
    return items(1); 
} elseif ($rand < $plate) { 
    return items(2); 
} elseif ($rand < $dish) { 
    return items(3); 
} 

希望這有助於。

0

我會做這一樣你,但你不必計算百分比,可以使用更多超過100個元素。

例如,如果A = 80且B = 40,則可以使用包含120個元素的數組。

但是,在數學中有一個術語greatest common divisor,您可以減少元素的數量。在這個例子中,GCD是40,所以A會是2,B會是1,並且您的數組大小會減少到3個元素。例如,當元素的總數量非常大時,這可能很重要。

+0

太棒了!希望我也是一個數學傢伙:S,但是,我的數據不會適合這種情況,恐怕它有50,10,5.5,1和0.5的值。在這個GCD中是0.5。我只是看着[this](http://stackoverflow.com/questions/8280514/returning-a-random-value-from-array-with-probability-proportional-to-its-value?rq=1)。我試圖理解答案,似乎很安靜,但現在無法吸收它。 – Junaid

+0

如果你的值低於1,你需要把它們全部乘以2,所以有1(2 * 0,5)作爲GCD,可惜。但在問題的例子中,GCD是5,所以'jug'是5,'glass'是10,'plate'是4,'dish'是1. – Voitcus

+2

我認爲@Floin的解決方案更好。 – Voitcus