编写游戏代码时,经常会遇到一些需求,需要根据权重数组来生成抽奖结果,以下给出具体方法:
/**
* 生成权重概率
* @param array $randArr 包含概率字段的数组,比如array( array('id' => 1, 'rate' => 40.99), array('id' => 2, 'rate' => 59.01));
* @param int || string $rateKey 概率值在数组中的键名, 比如$randArr中的'rate'
* @return $randArr数组中的某个索引值
*/
public static function createRandomKey($randArr, $rateKey){
$total = 0;
$chooseArr = array();
$pow = 0;
foreach($randArr as $k => $v){
$tmp = explode('.', strval($v[$rateKey]));
if($tmp[1] && strlen($tmp[1]) > $pow){
$pow = strlen($tmp[1]);
}
}
$r = pow(10, $pow);
foreach($randArr as $key => $value){
$total = $total + $value[$rateKey] * $r;
$chooseArr[$key] = $total;
};
$rand = rand(1, $total);
$before = 0;
foreach ($chooseArr as $k => $v){
$v = $v * $r;
if($rand > $before && $rand <= $v){
$chooseIndex = $k;
break;
}
$before = $v;
}
return $chooseIndex;
}