今天遇到这样的一个问题 封装一个 抽奖概率函数 思前想后去网上找点资料吧,而且不止一种方法 这种我感觉还是比较容易的 还是那句话 实现功能的思路不止一种 代码也不止一种
1 function get_rand($proArr) {
2 $result = '';
3
4 //概率数组的总概率精度
5 $proSum = array_sum($proArr);
6
7 //概率数组循环
8 foreach ($proArr as $key => $proCur) {
9 $randNum = mt_rand(1, $proSum);
10 if ($randNum <= $proCur) {
11 $result = $key;
12 break;
13 } else {
14 $proSum -= $proCur;
15 }
16 }
17 unset ($proArr);
18 return $result;
19 }
20
21
22 $prize_arr = array(
23 '0' => array('id'=>1,'prize'=>'平板电脑','v'=>0.1),
24 '1' => array('id'=>2,'prize'=>'数码相机','v'=>5),
25 '2' => array('id'=>3,'prize'=>'音箱设备','v'=>10),
26 '3' => array('id'=>4,'prize'=>'4G优盘','v'=>12),
27 '4' => array('id'=>5,'prize'=>'10Q币','v'=>22),
28 '5' => array('id'=>6,'prize'=>'下次没准就能中哦','v'=>50),
29 );
30
31
32 foreach ($prize_arr as $key => $val) {
33 $arr[$val['id']] = $val['v'];
34 }
35 $rid = get_rand($arr); //根据概率获取奖项id
36 $res['yes'] = $prize_arr[$rid-1]['prize']; //中奖项
37 unset($prize_arr[$rid-1]); //将中奖项从数组中剔除,剩下未中奖项
38 shuffle($prize_arr); //打乱数组顺序
39 for($i=0;$i<count($prize_arr);$i++){
40 $pr[] = $prize_arr[$i]['prize'];
41 }
42 $res['no'] = $pr;
43 echo json_encode($res,JSON_UNESCAPED_UNICODE);