php編寫抽獎后台實現抽獎概率計算


下面提供兩種抽獎中獎率計算的算法 ,第一種是自己設計出來的 ,第二種是比較經典的。 最重要的一點 概率學: 基數越大越能體現出中獎率。  比如扔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

  


免責聲明!

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



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