PHP抽獎(jiǎng)算法程序代碼分享
抽獎(jiǎng)算法需要滿足的需求如下:
1.可以控制中獎(jiǎng)的概率
2.具有隨機(jī)性
3.最好可以控制獎(jiǎng)品的數(shù)量
4.根據(jù)用戶ID或者ip、手機(jī)號、QQ號等條件限制抽獎(jiǎng)次數(shù)
初期就這些需求,然后根據(jù)網(wǎng)上的資料,采用了一種階段式抽取的方法,大家下面看一下整體的程序:
該程序是在ThinkPHP框架下完成的,使用了一些框架自帶的類庫和函數(shù),下面我會逐一進(jìn)行說明,控制器部分:
代碼如下
<?php /** * * * @lanfengye <zibin_5257@163.com> */ class ChoujiangAction extends Action { //抽獎(jiǎng)的開始時(shí)間 var $begin_time="2012-12-25 14:00:00"; //開始時(shí)間 0-不限制 //抽獎(jiǎng)的結(jié)束時(shí)間 var $stop_time="0"; //結(jié)束時(shí)間 0-不限制 //本次抽獎(jiǎng)的獎(jiǎng)項(xiàng)信息,必須按照從大到小的順序進(jìn)行填寫,id為獎(jiǎng)次,prize為中獎(jiǎng)信息,v為中獎(jiǎng)概率,num為獎(jiǎng)品數(shù)量 //需要注意的是,該處也必須包含不中獎(jiǎng)的信息,概率從小到大進(jìn)行排序 var $prize_arr = array( '0' => array('id' => 1, 'prize' => '44元購買1G/年空間', 'v' => 1,'num'=>1), '1' => array('id' => 2, 'prize' => '55元購買1G/年空間', 'v' => 2,'num'=>2), '2' => array('id' => 3, 'prize' => '66元購買1G/年空間', 'v' => 5,'num'=>2), '3' => array('id' => 4, 'prize' => '77元購買1G/年空間', 'v' => 10,'num'=>3), '4' => array('id' => 5, 'prize' => '88元購買1G/年空間', 'v' => 15,'num'=>4), '5' => array('id' => 6, 'prize' => '99元購買1G/年空間', 'v' => 67,'num'=>10), ); //首頁顯示方法 public function index(){ //連接數(shù)據(jù)庫,去獲取本次中獎(jiǎng)的人員名單 $Choujiang=M('Choujiang'); $this->assign('list', $Choujiang->where("rid>0")->order('id desc')->select()); unset($Choujiang); //在首頁中顯示抽獎(jiǎng)的開始時(shí)間 $this->assign('begin_time',$this->begin_time); $this->display(); } /** * 生成中獎(jiǎng)信息,ajax進(jìn)行請求該方法,需要客戶填寫QQ號碼 */ public function make() { $qq_no= trim($_POST['qq_no']); import('ORG.Util.Input'); $qq_no=Input::getVar($qq_no); if(empty($qq_no)){ $this->ajaxReturn(1, '請正確填寫QQ號碼!'); exit; } if(!empty($this->begin_time) && time()<strtotime($this->begin_time)){ $this->ajaxReturn(1, '抽獎(jiǎng)還沒有開始,開始時(shí)間為:'.$this->begin_time); exit; } if(!empty($this->stop_time) && time()>strtotime($this->stop_time)){ $this->ajaxReturn(1, '本次抽獎(jiǎng)已經(jīng)結(jié)束,結(jié)束時(shí)間為:'.$this->stop_time); exit; } //獲取獎(jiǎng)項(xiàng)信息數(shù)組,來源于私有成員 $prize_arr= $this->prize_arr; foreach ($prize_arr as $key => $val) { $arr[$val['id']] = $val['v']; } //$rid中獎(jiǎng)的序列號碼 $rid = $this->get_rand($arr); //根據(jù)概率獲取獎(jiǎng)項(xiàng)id $str = $prize_arr[$rid - 1]['prize']; //中獎(jiǎng)項(xiàng) $Choujiang=M('Choujiang'); //從數(shù)據(jù)庫中獲取特定QQ號已經(jīng)參加抽獎(jiǎng)的次數(shù),如果大于等于3則提示次數(shù)用完 if($Choujiang->where("qq_no='{$qq_no}'")->count()>=3){ $str='您3次抽獎(jiǎng)機(jī)會已經(jīng)用完!'; $rid=0; //從數(shù)據(jù)庫中獲取特定獎(jiǎng)項(xiàng)序號的次數(shù),大于等于設(shè)置的最大次數(shù)則提示獎(jiǎng)品被抽完,如果需要一直中最后一個(gè)紀(jì)念獎(jiǎng),則修改該處即可 }elseif ($Choujiang->where("rid={$rid}")->count()>=$prize_arr[$rid-1]['num']) { $str='很抱歉,您所抽中的獎(jiǎng)項(xiàng)已經(jīng)中完!'; $rid=0; } //生成一個(gè)用戶抽獎(jiǎng)的數(shù)據(jù),用來記錄到數(shù)據(jù)庫 $data=array( 'rid'=>$rid, 'pop'=>$str, 'qq_no'=>$qq_no, 'input_time'=>time() ); //將用戶抽獎(jiǎng)信息數(shù)組寫入數(shù)據(jù)庫 $Choujiang->add($data); unset($Choujiang); //ajax返回信息 $this->ajaxReturn(1, $str); } /** * 根據(jù)概率獲取中獎(jiǎng)號碼 */ private function get_rand($proArr) { $result = ''; //概率數(shù)組的總概率精度 $proSum = array_sum($proArr); //概率數(shù)組循環(huán) foreach ($proArr as $key => $proCur) { $randNum = mt_rand(1, $proSum); if ($randNum <= $proCur) { $result = $key; break; } else { $proSum -= $proCur; } } unset($proArr); return $result; } } ?>
該算法簡單使用,并發(fā)訪問性能非常好,稍加改動(dòng)就可以用于各種場合,結(jié)合用戶登錄等信息可有效控制每個(gè)人的抽獎(jiǎng)次數(shù)。將開始和結(jié)束之間更改為數(shù)組,就可以完善成為每天特定時(shí)間抽獎(jiǎng)的程序。
希望大家可以結(jié)合有關(guān)php抽獎(jiǎng)程序的文章進(jìn)行深入學(xué)習(xí),更好的掌握這門語言的應(yīng)用技巧。
相關(guān)文章
ThinkPHP實(shí)現(xiàn)微信支付(jsapi支付)流程教程詳解
這篇文章主要介紹了ThinkPHP實(shí)現(xiàn)微信支付(jsapi支付)流程教程詳解,需要的朋友可以參考下2018-03-03PHP與Ajax相結(jié)合實(shí)現(xiàn)登錄驗(yàn)證小Demo
AJAX即“Asynchronous Javascript And XML”(異步JavaScript和XML),是指一種創(chuàng)建交互式網(wǎng)頁應(yīng)用的網(wǎng)頁開發(fā)技術(shù)。接下來通過本文給大家分享PHP與Ajax相結(jié)合實(shí)現(xiàn)登錄驗(yàn)證小Demo,對php ajax實(shí)現(xiàn)登錄驗(yàn)證相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧2016-03-03PHP隱藏手機(jī)號碼、銀行卡號、真實(shí)姓名部分內(nèi)容的方法
這篇文章主要介紹了PHP隱藏手機(jī)號碼、銀行卡號、真實(shí)姓名部分內(nèi)容的方法的實(shí)現(xiàn)代碼,有時(shí)候我們需要將部分內(nèi)容隱藏那么就可能需要下面的代碼了,需要的朋友可以參考下2023-11-11laravel 實(shí)現(xiàn)關(guān)閉CSRF(全部關(guān)閉、部分關(guān)閉)
今天小編就為大家分享一篇laravel 實(shí)現(xiàn)關(guān)閉CSRF(全部關(guān)閉、部分關(guān)閉),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10yii框架通過控制臺命令創(chuàng)建定時(shí)任務(wù)示例
這篇文章主要介紹了yii框架通過控制臺命令創(chuàng)建定時(shí)任務(wù)示例,需要的朋友可以參考下2014-04-04