/**
* $arr 抽奖名单 array()
* $n 中奖份数
* $e 额外份数
* $s 总份数
* $s_ 未中奖份数
* $p 特殊概率
* $pn 特殊用户抽取份数
* $sid 特殊用户
*/
public function checku($n,$arr,$p,$sid){
$s_ = $s = count($arr); //未中奖总份数 总份数
$pn = array_count_values($arr)[$sid]; //特殊用户抽取份数
$e = ceil(($p * $s - $pn)/(1 - $p)); //特殊概率下需加的额外份数
$check = array(); //中奖名单
for($a=0 ;$a<$n ;$a++){
if($pn){ //判断特殊用户剩余抽奖份数
$s_ = $s_ + $e; //未中奖总份数
}
$checknum = rand(1 , $s_);
if($checknum > count($arr)){ //大于当前未中奖份数为特殊用户中奖
$check[] = $sid;
$pn--;
$e--;
}else{ //否则普通用户中奖
if(!$pn && $arr[$checknum]==$sid){
array_splice($arr,$checknum,1);
}
if($arr[$checknum]==$sid){
$pn--;
}
$check[] = $arr[$checknum];
array_splice($arr,$checknum,1);
}
$s_ = count($arr);
}
// $arr=array();
// for($a=1 ;$a<=100 ;$a++){
// if($a%10) $arr[]=$a; else $arr[]=3;
// }
// $result=$this->checku(10,$arr,80/100,3);
// echo "<pre/>";var_dump($result,array_count_values($result)[3]/count($result));die;
return $check;
}
朋友所写 概率问题
最新推荐文章于 2024-04-15 14:58:51 发布