php控制概率算法场景

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章