下面提供兩種抽獎中獎率計算的算法 ,第一種是自己設計出來的 ,第二種是比較經典的。 最重要的一點 概率學: 基數越大越能體現出中獎率。 比如扔10次硬幣 5次正面和5次反面的概率比較小, 但是扔100次 1000次 10000次時 得到50%正50%反的結果越來越明顯
方法一:
1 //獎品的集合列表 2 $prize_list = [ 3 [ 4 "id" => 1, //獎品的唯一標示 5 "name" => "獎品名稱1", //獎品的名稱 6 "img" => "upload/imgs/1578904174tR4llI.png", //獎品的圖片 7 "pro" => 5, //獎品中獎的基數 這里的基數必須為正整數 8 "num" => 0, //獎品允許抽中的次數 0表示不限制 9 ], 10 [ 11 "id" => 2, 12 "name" => "獎品名稱2", 13 "img" => "upload/imgs/1578968755ie9uow.png", 14 "pro" => 5, 15 "num" => 0, 16 ] 17 ]; 18 //計算獎品的概率問題(方法一) 假設我們所有獎品的中獎率設定為百分比,最小的中獎率是1%最大中獎率是100% 19 $arr = []; //根據獎品的中獎率生成一個中獎集合,集合越大,中獎率越准確 20 foreach ( $prize_list as $key => $vo ){ 21 //如果中獎率小於1 將不會加入到中獎集合中(永遠都不會被抽中) 22 if( $vo >= 1 ){ 23 for( $i = 1 ; $i <= $vo['pro'] ; $i++ ){ //循環獎品設置的中獎率 , 24 array_push( $arr ,$vo['id'] ); // 循環將獎品的id添加到中獎的集合中(如果商品A的中獎率為20,那么商品A的id就會咋中獎集合中重復20次) 25 } 26 } 27 } 28 //隨機打算數組內中獎id的順序 29 shuffle( $arr ); 30 $lucky_index = array_rand( $arr , 1 ); //隨機從中獎的集合中獲取一個中獎的元素(這里返回的是當前元素所在的索引) 31 $lucky_id = $arr[$lucky_index]; //這里最終確定了抽中的獎品id 32 return $lucky_id;
方法二:
1 //獎品的集合列表 2 $prize_list = [ 3 [ 4 "id" => 1, //獎品的唯一標示 5 "name" => "獎品名稱1", //獎品的名稱 6 "img" => "upload/imgs/1578904174tR4llI.png", //獎品的圖片 7 "pro" => 5, //獎品中獎的基數 這里的基數必須為正整數 8 "num" => 0, //獎品允許抽中的次數 0表示不限制 9 ], 10 [ 11 "id" => 2, 12 "name" => "獎品名稱2", 13 "img" => "upload/imgs/1578968755ie9uow.png", 14 "pro" => 5, 15 "num" => 0, 16 ] 17 ]; 18 $arr_pro = []; //抽獎的集合 最總的結果在次數組的產生 19 foreach ( $prize_list as $key => $vo ){ 20 $arr_pro[$vo['id']] = $vo['pro']; 21 } 22 //計算概率數組的總基數(基數越大 中獎率越准確) 23 $arr_num = array_sum( $arr_pro ); //將所有的中獎率累加起來得到一個基數 24 $lucky_id = ''; 25 //概率數組循環27 foreach ($arr_pro as $key => $vv) { 28 $randNum = mt_rand(1, $arr_num); 29 if ($randNum <= $vv) { 30 $lucky_id = $key; 31 break; 32 } else { 33 $arr_num -= $vv; 34 }36 } 37 unset($arr_pro); 38 return $lucky_id;
這里給大家提供一個開發抽獎系統的思路問題的文章:https://www.cnblogs.com/hinq/articles/12195497.html
