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 則是第二種。

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