php

位置:IT落伍者 >> php >> 浏览文章

PHP中奖概率的抽奖算法程序代码


发布日期:2020年08月11日
 
PHP中奖概率的抽奖算法程序代码

初期就这些需求然后根据网上的资料采用了一种阶段式抽取的方法大家下面看一下整体的程序 该程序是在ThinkPHP框架下完成的使用了一些框架自带的类库和函数下面我会逐一进行说明控制器部分

抽奖算法需要满足的需求如下

可以控制中奖的概率

具有随机性

最好可以控制奖品的数量

根据用户ID或者ip手机号QQ号等条件限制抽奖次数


初期就这些需求然后根据网上的资料采用了一种阶段式抽取的方法大家下面看一下整体的程序

该程序是在ThinkPHP框架下完成的使用了一些框架自带的类库和函数下面我会逐一进行说明控制器部分

                        代码如下                                        <?php
            
            /**
            *
            *
            * @lanfengye <zibin_@com>
            */
            class ChoujiangActionextends 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(ORGUtilInput);
             $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;
             }
            
            }
            
            
            
            ?>            

该算法简单使用并发访问性能非常好稍加改动就可以用于各种场合结合用户登录等信息可有效控制每个人的抽奖次数将开始和结束之间更改为数组就可以完善成为每天特定时间抽奖的程序

               

上一篇:PHP实现常见排序

下一篇:PHP文件如何怎么打开