public function doDraw()
{
// 奖品数组
$proArr = array(
// id => 奖品等级, name => 奖品名称, v => 奖品权重
array('id'=>1,'name'=>'超级奖品','v'=>0),
array('id'=>2,'name'=>'特等奖','v'=>1),
array('id'=>3,'name'=>'一等奖','v'=>5),
array('id'=>4,'name'=>'二等奖','v'=>10),
array('id'=>5,'name'=>'三等奖','v'=>12),
array('id'=>6,'name'=>'四等奖','v'=>22),
array('id'=>7,'name'=>'五等奖','v'=>50),
array('id'=>8,'name'=>'六等奖','v'=>100),
array('id'=>9,'name'=>'七等奖','v'=>200),
array('id'=>10,'name'=>'没中奖','v'=>500),
);
$arr = [];
foreach ($proArr as $key => $val) {
$arr[$val['id']] = $val['v'];
}
// 中奖 id
$rid = $this->get_rand($arr);
/**模拟抽奖测试**/
/* $i = 0;
while ( $i < 10000) {
$rid = $this->get_rand($arr);
$res[] = $rid;
$i++;
}
// 统计奖品出现次数
$result = array_count_values($res);
asort($result);
foreach ($result as $id => $times) {
foreach ($proArr as $gifts) {
if($id == $gifts['id']){
$response[$gifts['name']] = $times;
}
}
}
dump($response);
die;*/
// 中奖礼品
$result['yes'] = $proArr[$rid-1]['name'];
// 从原奖品数组中剔除已经中奖礼品
unset($proArr[$rid-1]);
// 打乱数组排序
shuffle($proArr);
for ($i=0; $i < count($proArr); $i++) {
$result['no'][] = $proArr[$i]['name'];
}
// foreach ($proArr as $k => $v) {
// // 没中奖礼品
// $result['no'][] = $v['name'];
// }
dump($result);
}
public function get_rand($proArr = array()) {
if(empty($proArr)) die;
$rid = '';
// 概率数组的总权重
$proSum = array_sum($proArr);
// 概率数组循环
foreach ($proArr as $k => $proCur) {
// 从 1 到概率总数中任意取值
$randNum = mt_rand(1, $proSum);
// 判断随机数是否在概率权重中
if ($randNum <= $proCur) {
// 取出奖品 id
$rid = $k;
break;
} else {
// 如果随机数不在概率权限中,则不断缩小总权重,直到从奖品数组中取出一个奖品
$proSum -= $proCur;
}
}
unset($proArr);
return $rid;
}