最近公司有兩個活動, 一個是砸蛋活動, 另一個是轉盤活動。
后台這邊需要做接口進行對接,當用戶在前台點擊進行抽獎的時候,發送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.'*'." "." "." "; 54 } 55 } 56 57 return $result; 58 } 59 60 $res = get_rand($item); 61 $prize = $prize_arr[$res-1]['prize']; 62 echo $prize;
輸出得到:
循環遍歷,不停獲取隨機數並縮小概率空間,如果中一等獎只經過一層循環,概率越大的,經過循環的次數就越多有點像高中的概率的題目, 如果不中五等獎,那么必中六等獎!