初期就這些需求然後根據網上的資料采用了一種階段式抽取的方法大家下面看一下整體的程序 該程序是在ThinkPHP框架下完成的使用了一些框架自帶的類庫和函數下面我會逐一進行說明控制器部分
抽獎算法需要滿足的需求如下
可以控制中獎的概率
具有隨機性
最好可以控制獎品的數量
根據用戶ID或者ip手機號QQ號等條件限制抽獎次數
初期就這些需求然後根據網上的資料采用了一種階段式抽取的方法大家下面看一下整體的程序
該程序是在ThinkPHP框架下完成的使用了一些框架自帶的類庫和函數下面我會逐一進行說明控制器部分
代碼如下
<?php
/**
*
*
* @lanfengye <zibin_
@
com>
*/
class ChoujiangAction extends Action {
//抽獎的開始時間
var $begin_time="
:
:
"; //開始時間
不限制
//抽獎的結束時間
var $stop_time="
"; //結束時間
不限制
//本次抽獎的獎項信息
必須按照從大到小的順序進行填寫
id為獎次
prize為中獎信息
v為中獎概率
num為獎品數量
//需要注意的是
該處也必須包含不中獎的信息
概率從小到大進行排序
var $prize_arr = array(
=> array(
id
=>
prize
=>
元購買
G/年空間
v
=>
num
=>
)
=> array(
id
=>
prize
=>
元購買
G/年空間
v
=>
num
=>
)
=> array(
id
=>
prize
=>
元購買
G/年空間
v
=>
num
=>
)
=> array(
id
=>
prize
=>
元購買
G/年空間
v
=>
num
=>
)
=> array(
id
=>
prize
=>
元購買
G/年空間
v
=>
num
=>
)
=> array(
id
=>
prize
=>
元購買
G/年空間
v
=>
num
=>
)
);
//首頁顯示方法
public function index(){
//連接數據庫
去獲取本次中獎的人員名單
$Choujiang=M(
Choujiang
);
$this
>assign(
list
$Choujiang
>where("rid>
")
>order(
id desc
)
>select());
unset($Choujiang);
//在首頁中顯示抽獎的開始時間
$this
>assign(
begin_time
$this
>begin_time);
$this
>display();
}
/**
* 生成中獎信息
ajax進行請求該方法
需要客戶填寫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(
請正確填寫QQ號碼!
);
exit;
}
if(!empty($this
>begin_time) && time()<strtotime($this
>begin_time)){
$this
>ajaxReturn(
抽獎還沒有開始
開始時間為
$this
>begin_time);
exit;
}
if(!empty($this
>stop_time) && time()>strtotime($this
>stop_time)){
$this
>ajaxReturn(
本次抽獎已經結束
結束時間為
$this
>stop_time);
exit;
}
//獲取獎項信息數組
來源於私有成員
$prize_arr= $this
>prize_arr;
foreach ($prize_arr as $key => $val) {
$arr[$val[
id
]] = $val[
v
];
}
//$rid中獎的序列號碼
$rid = $this
>get_rand($arr); //根據概率獲取獎項id
$str = $prize_arr[$rid
][
prize
]; //中獎項
$Choujiang=M(
Choujiang
);
//從數據庫中獲取特定QQ號已經參加抽獎的次數
如果大於等於
則提示次數用完
if($Choujiang
>where("qq_no=
{$qq_no}
")
>count()>=
){
$str=
您
次抽獎機會已經用完!
;
$rid=
;
//從數據庫中獲取特定獎項序號的次數
大於等於設置的最大次數則提示獎品被抽完
如果需要一直中最後一個紀念獎
則修改該處即可
}elseif ($Choujiang
>where("rid={$rid}")
>count()>=$prize_arr[$rid
][
num
]) {
$str=
很抱歉
您所抽中的獎項已經中完!
;
$rid=
;
}
//生成一個用戶抽獎的數據
用來記錄到數據庫
$data=array(
rid
=>$rid
pop
=>$str
qq_no
=>$qq_no
input_time
=>time()
);
//將用戶抽獎信息數組寫入數據庫
$Choujiang
>add($data);
unset($Choujiang);
//ajax返回信息
$this
>ajaxReturn(
$str);
}
/**
* 根據概率獲取中獎號碼
*/
private function get_rand($proArr) {
$result =
;
//概率數組的總概率精度
$proSum = array_sum($proArr);
//概率數組循環
foreach ($proArr as $key => $proCur) {
$randNum = mt_rand(
$proSum);
if ($randNum <= $proCur) {
$result = $key;
break;
} else {
$proSum
= $proCur;
}
}
unset($proArr);
return $result;
}
}
?>
該算法簡單使用並發訪問性能非常好稍加改動就可以用於各種場合結合用戶登錄等信息可有效控制每個人的抽獎次數將開始和結束之間更改為數組就可以完善成為每天特定時間抽獎的程序
From:http://tw.wingwit.com/Article/program/PHP/201311/21193.html