2017-04-15 38 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

对不起,我迟到的回应。感谢您的答复! –