国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

PHP中獎概率的抽獎算法程序代碼

2024-05-04 21:48:31
字體:
供稿:網(wǎng)友

1.可以控制中獎的概率,2.具有隨機(jī)性,3.最好可以控制獎品的數(shù)量,4.根據(jù)用戶ID或者ip、手機(jī)號、QQ號等條件限制抽獎次數(shù)

初期就這些需求,然后根據(jù)網(wǎng)上的資料,采用了一種階段式抽取的方法,大家下面看一下整體的程序.該程序是在ThinkPHP框架下完成的,使用了一些框架自帶的類庫和函數(shù),下面我會逐一進(jìn)行說明,控制器部分,代碼如下:

  1. <?php 
  2. /** 
  3.  *  
  4.  * 
  5.  * @lanfengye <zibin_5257@163.com> 
  6.  */ 
  7. class ChoujiangAction extends Action { 
  8.      //抽獎的開始時(shí)間 
  9.     //開源代碼Vevb.com 
  10.     var $begin_time="2012-12-25 14:00:00"//開始時(shí)間  0-不限制 
  11.     //抽獎的結(jié)束時(shí)間 
  12.     var $stop_time="0";  //結(jié)束時(shí)間  0-不限制 
  13.        
  14.     //本次抽獎的獎項(xiàng)信息,必須按照從大到小的順序進(jìn)行填寫,id為獎次,prize為中獎信息,v為中獎概率,num為獎品數(shù)量 
  15.     //需要注意的是,該處也必須包含不中獎的信息,概率從小到大進(jìn)行排序 
  16.     var $prize_arr = array
  17.         '0' => array('id' => 1, 'prize' => '44元購買1G/年空間''v' => 1,'num'=>1), 
  18.         '1' => array('id' => 2, 'prize' => '55元購買1G/年空間''v' => 2,'num'=>2), 
  19.         '2' => array('id' => 3, 'prize' => '66元購買1G/年空間''v' => 5,'num'=>2), 
  20.         '3' => array('id' => 4, 'prize' => '77元購買1G/年空間''v' => 10,'num'=>3), 
  21.         '4' => array('id' => 5, 'prize' => '88元購買1G/年空間''v' => 15,'num'=>4), 
  22.         '5' => array('id' => 6, 'prize' => '99元購買1G/年空間''v' => 67,'num'=>10), 
  23.     ); 
  24.       
  25.  
  26.     //首頁顯示方法      
  27.     public function index(){ 
  28.         //連接數(shù)據(jù)庫,去獲取本次中獎的人員名單 
  29.         $Choujiang=M('Choujiang'); 
  30.         $this->assign('list'$Choujiang->where("rid>0")->order('id desc')->select()); 
  31.         unset($Choujiang); 
  32.            
  33.         //在首頁中顯示抽獎的開始時(shí)間 
  34.         $this->assign('begin_time',$this->begin_time); 
  35.            
  36.         $this->display(); 
  37.     } 
  38.        
  39.    
  40.        
  41.     /** 
  42.      * 生成中獎信息,ajax進(jìn)行請求該方法,需要客戶填寫QQ號碼 
  43.      */ 
  44.     public function make() { 
  45.         $qq_no=  trim($_POST['qq_no']); 
  46.         import('ORG.Util.Input'); 
  47.         $qq_no=Input::getVar($qq_no); 
  48.            
  49.         if(emptyempty($qq_no)){ 
  50.             $this->ajaxReturn(1, '請正確填寫QQ號碼!'); 
  51.             exit
  52.         } 
  53.            
  54.         if(!emptyempty($this->begin_time) && time()<strtotime($this->begin_time)){ 
  55.             $this->ajaxReturn(1, '抽獎還沒有開始,開始時(shí)間為:'.$this->begin_time); 
  56.             exit
  57.         } 
  58.            
  59.         if(!emptyempty($this->stop_time) && time()>strtotime($this->stop_time)){ 
  60.             $this->ajaxReturn(1, '本次抽獎已經(jīng)結(jié)束,結(jié)束時(shí)間為:'.$this->stop_time); 
  61.             exit
  62.         } 
  63.            
  64.          //獲取獎項(xiàng)信息數(shù)組,來源于私有成員 
  65.         $prize_arr=  $this->prize_arr; 
  66.            
  67.         foreach ($prize_arr as $key => $val) { 
  68.             $arr[$val['id']] = $val['v']; 
  69.         } 
  70.         //$rid中獎的序列號碼 
  71.         $rid = $this->get_rand($arr); //根據(jù)概率獲取獎項(xiàng)id 
  72.            
  73.         $str = $prize_arr[$rid - 1]['prize']; //中獎項(xiàng)  
  74.            
  75.         $Choujiang=M('Choujiang'); 
  76.            
  77.             //從數(shù)據(jù)庫中獲取特定QQ號已經(jīng)參加抽獎的次數(shù),如果大于等于3則提示次數(shù)用完 
  78.         if($Choujiang->where("qq_no='{$qq_no}'")->count()>=3){ 
  79.             $str='您3次抽獎機(jī)會已經(jīng)用完!'
  80.             $rid=0; 
  81.             //從數(shù)據(jù)庫中獲取特定獎項(xiàng)序號的次數(shù),大于等于設(shè)置的最大次數(shù)則提示獎品被抽完,如果需要一直中最后一個(gè)紀(jì)念獎,則修改該處即可 
  82.         }elseif ($Choujiang->where("rid={$rid}")->count()>=$prize_arr[$rid-1]['num']) { 
  83.             $str='很抱歉,您所抽中的獎項(xiàng)已經(jīng)中完!'
  84.             $rid=0; 
  85.         } 
  86.         //生成一個(gè)用戶抽獎的數(shù)據(jù),用來記錄到數(shù)據(jù)庫 
  87.         $data=array
  88.             'rid'=>$rid
  89.             'pop'=>$str
  90.             'qq_no'=>$qq_no
  91.             'input_time'=>time() 
  92.         ); 
  93.         //將用戶抽獎信息數(shù)組寫入數(shù)據(jù)庫 
  94.            
  95.         $Choujiang->add($data); 
  96.         unset($Choujiang); 
  97.            
  98.          //ajax返回信息 
  99.         $this->ajaxReturn(1, $str); 
  100.     } 
  101.        
  102.     /** 
  103.      * 根據(jù)概率獲取中獎號碼 
  104.      */ 
  105.     private function get_rand($proArr) { 
  106.         $result = ''
  107.         //概率數(shù)組的總概率精度  
  108.         $proSum = array_sum($proArr); 
  109.         //概率數(shù)組循環(huán)  
  110.         foreach ($proArr as $key => $proCur) { 
  111.             $randNum = mt_rand(1, $proSum); 
  112.             if ($randNum <= $proCur) { 
  113.                 $result = $key
  114.                 break
  115.             } else { 
  116.                 $proSum -= $proCur
  117.             } 
  118.         } 
  119.         unset($proArr); 
  120.         return $result
  121.     } 
  122.        
  123. ?>  

該算法簡單使用,并發(fā)訪問性能非常好,稍加改動就可以用于各種場合,結(jié)合用戶登錄等信息可有效控制每個(gè)人的抽獎次數(shù),將開始和結(jié)束之間更改為數(shù)組,就可以完善成為每天特定時(shí)間抽獎的程序.

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 老河口市| 东乡县| 清镇市| 盐亭县| 静乐县| 革吉县| 宜丰县| 买车| 丹棱县| 海淀区| 舒兰市| 无棣县| 恩施市| 大方县| 清丰县| 宝山区| 肥城市| 鄂尔多斯市| 屯昌县| 西峡县| 东乌珠穆沁旗| 农安县| 菏泽市| 惠水县| 宣化县| 高要市| 昌都县| 古浪县| 依安县| 巴东县| 河南省| 海安县| 漳浦县| 菏泽市| 肥东县| 鄂伦春自治旗| 讷河市| 古蔺县| 镶黄旗| 筠连县| 武清区|