2017-04-15 79 views
2

我有以下腳本:在陣列PHP隨機值ponderated

$domain = ['gmail.com', 'yahoo.com', 'hotmail.com']; 
$domain = $domain[mt_rand(0, count($domain) - 1)]; 

,能夠設定對每個項目coresponding到被選擇的機會一個百分比值。例如,我想有75%的機會擁有$ domain ='gmail.com';.

+1

'$ i = mt_rand(0,100); if($ i <75)$ domain = $ domain [0];' – splash58

+0

它使用Mersenne Twister算法。如果你需要定製一個,你爲什麼不創建一個? – Thamilan

+0

$ domain = ['gmail.com','gmail.com','gmail.com','gmail.com','yahoo.com','hotmail.com']; 4:2現在有更多機會獲得gmail。只是一個棘手的不正確的方式。 –

回答

1

有很多方法可以達到預期的效果。

我的方法並不要求總「機會」是100;你可以自己決定最高鑰匙的價值。

我的方法的基礎是結果($domain)將是最小的密鑰不大於隨機數($pick)的數組值。

下面是一個給gmail 75%的機會,並給予其餘25%的機會的機會。

*請注意,mt_rand()從1開始,而0在問題下評論。

$domain_perc=array(
    750=>'gmail.com', // between 1 & 750 = 75% chance 
    875=>'yahoo.com', // between 751 & 875 = 12.5% chance 
    1000=>'hotmail.com' // between 876 & 1000 = 12.5% chance 
); 

$pick=mt_rand(1,max(array_keys($domain_perc))); 

foreach($domain_perc as $p=>$v){ 
    if($pick<=$p){ 
     $domain=$v; 
     break; 
    } 
} 

或者也可以與此一襯墊更換foreach()代碼塊:

$domain=current(array_filter($domain_perc,function($v,$k)use($pick){return $pick<=$k;},ARRAY_FILTER_USE_BOTH)); 

作爲用於定製輸入陣列,表達爲50%-25%-25%分割的一個簡單的方法將是:

$domain_perc=array(
    2=>'gmail.com', // 1 and 2 of 4 = 50% chance 
    3=>'yahoo.com', // 3 of 4 = 25% chance 
    4=>'hotmail.com' // 4 of 4 = 25% chance 
); 

要設置一個兩值陣列與〜33%〜航班嗎66%分割:

$domain_perc=array(
    1=>'gmail.com', // 1 of 3 = ~33% chance 
    3=>'yahoo.com'  // 2 & 3 of 3 = ~66% chance 
); 
+0

對不起,我遲到的迴應。感謝您的答覆! –