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;

輸出得到:

 

循環遍歷,不停獲取隨機數並縮小概率空間,如果中一等獎只經過一層循環,概率越大的,經過循環的次數就越多有點像高中的概率的題目, 如果不中五等獎,那么必中六等獎!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM