場景:某個網站用戶流量比較大,爲了降低短信服務壓力,現要求將 40% 的用戶登錄使用阿里雲短信驗證碼服務,剩餘60%的用戶登錄使用百度雲短信驗證碼服務。
短信服務商使用概率
// 短信服務使用概率集合
$smsService = [
0 => ['type' => 'ali', 'rate' => 40],
1 => ['type' => 'baidu', 'rate' => 60],
];
// 將rate字段放入data集合
$data = array_column($smsService, 'rate');
//$data 結果:Array([0 => 40], [1 => 60])
// 調用方法
$key = getRate($data); // 返回的是key
// 輸出type
$type = $smsService[key]['type'];
echo $type;
/**
* 概率算法
* @param $data
* @return int|string
*/
private function getRate($data){
$result = 0;
// 獲取總權重:100
$sum = array_sum(data);
foreach($data as $key => $val){
$randNum = mt_rand(1, $sum);
if ($randNum <= $val){
$result = $key;
break;
}else {
$sum -= $val;
}
}
// 釋放 $data
unset($data);
return $result;
}
算法思路:
相當於將 [40,60]
放入一個數組中,然後從 1-100
中取一個值,取不到就縮小範圍取1-60 ,然後判斷 如果 <=40
則是第一種, <=60
則是第二種。