php中奖算法逻辑

最近公司有两个活动, 一个是砸蛋活动, 另一个是转盘活动。

后台这边需要做接口进行对接,当用户在前台点击进行抽奖的时候,发送AJAX请求给后台,后台进行业务处理包括记录用户中奖信息,然后返回json格式的数据给前台进行显示 其中最为核心的就是中奖的算法逻辑了。

在网上查看了一些算法之后发现下面这种算法效率比较高。

 1 <?php
 2 //中奖奖品
 3 $prize_arr = array(
 4 
 5     0=>array( 'id'=>1,'prize'=>'现金500W','v'=>1 ), //概率为1/200
 6     1=>array( 'id'=>2,'prize'=>'iphone7','v'=>5 ),  
 7     2=>array( 'id'=>3,'prize'=>'耐克跑鞋','v'=>10 ),
 8     3=>array( 'id'=>4,'prize'=>'魔声耳机','v'=>24 ),
 9     4=>array( 'id'=>5,'prize'=>'蓝牙音响','v'=>60 ),
10     5=>array( 'id'=>6,'prize'=>'现金1元','v'=>100 )
11 
12     );
13 
14 
15 /*
16  * 对数组进行处理
17  */
18 
19 foreach( $prize_arr as $k => $v ){
20     //使用新数组item
21     $item[$v['id']] = $v['v']; 
22 }
23 
24 /*
25  array(
26         1 => 1,
27         2 => 5,
28         3 => 10,
29         4 => 24,
30         5 => 60,
31         6 => 100
32      );    
33  */
34 
35 function get_rand($item){
36 
37     $num = array_sum($item);//计算出分母200
38 
39     foreach( $item as $k => $v ){
40      
41       $rand = mt_rand(1, $num);//概率区间(整数) 包括1和200
42       /*
43        *这个算法很666 
44        */
45       if( $rand <= $v ){
46           //循环遍历,当下标$k = 1的时候,只有$rand = 1 才能中奖 
47           $result = $k;
48           echo $rand.'--'.$v;
49           break;
50       }else{
51           //当下标$k=6的时候,如果$rand>100 必须$rand < = 100 才能中奖 ,那么前面5次循环之后$rand的概率区间= 200-1-5-10-24-60 (1,100) 必中1块钱
52           $num-=$v;
53           echo '*'.$rand.'*'."&ensp;"."&ensp;"."&ensp;";
54       }
55     }
56 
57     return $result;
58 }
59 
60 $res = get_rand($item);
61 $prize = $prize_arr[$res-1]['prize'];
62 echo $prize;

输出得到:

 

循环遍历,不停获取随机数并缩小概率空间,如果中一等奖只经过一层循环,概率越大的,经过循环的次数就越多有点像高中的概率的题目, 如果不中五等奖,那么必中六等奖!

posted @ 2017-03-30 12:08  zhoupufelix的博客  阅读(3536)  评论(0编辑  收藏  举报