场景:某个网站用户流量比较大,为了降低短信服务压力,现要求将 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
则是第二种。