標籤:res 包括 查看 src 分享 處理 後台 行業 pre
最近公司有兩個活動, 一個是砸蛋活動, 另一個是轉盤活動。
後台這邊需要做介面進行對接,當使用者在前台點擊進行抽獎的時候,發送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 //使用新數組item21 $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 => 10032 ); 33 */34 35 function get_rand($item){36 37 $num = array_sum($item);//計算出分母20038 39 foreach( $item as $k => $v ){40 41 $rand = mt_rand(1, $num);//機率區間(整數) 包括1和20042 /*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.‘*‘." "." "." ";54 }55 }56 57 return $result;58 }59 60 $res = get_rand($item);61 $prize = $prize_arr[$res-1][‘prize‘];62 echo $prize;
輸出得到:
迴圈遍曆,不停擷取隨機數並縮小機率空間,如果中一等獎只經過一層迴圈,機率越大的,經過迴圈的次數就越多有點像高中的機率的題目, 如果不中五等獎,那麼必中六等獎!
php中獎演算法邏輯