这是我写的一个比较简单的抽奖算法,并没有很严谨,用于我自己写的wap文字游戏(美味小镇)上的随机食材,可以设定概率值
/**
*CreatedbyPhpStorm.
*User:tioncico
*Date:/12/90009
*Time:14:50
*/
classRand
{
public$arr,$not_id,$if_repeat,$odds;
publicfunction__construct($arr,$if_repeat=1)
{
$this->arr=$arr;
$this->if_repeat=$if_repeat;
$this->get_odds_array();
}
functionaction($num=1)
{
if(!$this->arr||!$this->odds){
returnfalse;
}
$ids=array();
for($i=0;$i
$res=$this->get_rand($this->arr,$this->odds);
if($this->if_repeat==0){
if(count($this->arr)<=count($ids)){
return$ids;
}
if(in_array($res,$ids)){
$i--;
}else{
$ids[]=$res;
}
}else{
$ids[]=$res;
}
}
return$ids;
}
publicfunctionget_odds_array($arr=array())
{
$arr||$arr=$this->arr;
foreach($arras$k=>$va){
if(empty($va['odds'])){
$va['odds']=100;
}
$odds[$k]=$va['odds'];
}
$this->odds=array_sum($odds);
return$this;
}
publicfunctionadd_arr($arr=array()){
$this->arr=array_merge($this->arr,$arr);
return$this;
}
functionremove_id($arr=array(),$not_id=array()){
$arr||$arr=$this->arr;
$not_id||$not_id=$this->not_id;
if(empty($not_id)){
$this->arr=$arr;
return$this;
}
foreach($arras$k=>$va){
foreach($not_idas$vo){
if($k==$vo){
unset($arr[$k]);
}
}
}
$this->arr=$arr;
return$this;
}
//返回概率
functionget_rand($arr=array(),$odds=0)
{
$arr||$arr=$this->arr;
$odds||$odds=$this->odds;
//概率数组循环
$randNum=mt_rand(1,$odds);
$odd_num=0;
foreach($arras$key=>$va){
if($randNum>$odd_num&&$randNum<=$va['odds']+$odd_num){
return$arr[$key];
break;
}else{
$odd_num+=$va['odds'];
}
}
unset($proArr);
}
}
$arr=array(
array(
'id'=>1,
'odds'=>100//相对概率值
),
array(
'id'=>2,
'odds'=>10//相对概率值
),
array(
'id'=>3,
'odds'=>200//相对概率值
),
)
调用方法
$a=newRand($arr);
$a->action(1);
本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客