PHP抽奖算法程序代码分享_php实例

抽奖算法需要满足的需求如下:
1.可以控制中奖的概率
2.具有随机性
3.最好可以控制奖品的数量
4.根据用户ID或者ip、手机号、QQ号等条件限制抽奖次数
初期就这些需求,然后根据网上的资料,采用了一种阶段式抽取的方法,大家下面看一下整体的程序:
该程序是在ThinkPHP框架下完成的,使用了一些框架自带的类库和函数,下面我会逐一进行说明,控制器部分:
代码如下

<?php

/**
 *
 *
 * @lanfengye <zibin_5257@163.com>
 */
class ChoujiangAction extends Action {
   //抽奖的开始时间
  var $begin_time="2012-12-25 14:00:00"; //开始时间 0-不限制
  //抽奖的结束时间
  var $stop_time="0"; //结束时间 0-不限制

  //本次抽奖的奖项信息,必须按照从大到小的顺序进行填写,id为奖次,prize为中奖信息,v为中奖概率,num为奖品数量
  //需要注意的是,该处也必须包含不中奖的信息,概率从小到大进行排序
  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(){
    //连接数据库,去获取本次中奖的人员名单
    $Choujiang=M('Choujiang');
    $this->assign('list', $Choujiang->where("rid>0")->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(1, '请正确填写QQ号码!');
      exit;
    }

    if(!empty($this->begin_time) && time()<strtotime($this->begin_time)){
      $this->ajaxReturn(1, '抽奖还没有开始,开始时间为:'.$this->begin_time);
      exit;
    }

    if(!empty($this->stop_time) && time()>strtotime($this->stop_time)){
      $this->ajaxReturn(1, '本次抽奖已经结束,结束时间为:'.$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 - 1]['prize']; //中奖项 

    $Choujiang=M('Choujiang');

      //从数据库中获取特定QQ号已经参加抽奖的次数,如果大于等于3则提示次数用完
    if($Choujiang->where("qq_no='{$qq_no}'")->count()>=3){
      $str='您3次抽奖机会已经用完!';
      $rid=0;
      //从数据库中获取特定奖项序号的次数,大于等于设置的最大次数则提示奖品被抽完,如果需要一直中最后一个纪念奖,则修改该处即可
    }elseif ($Choujiang->where("rid={$rid}")->count()>=$prize_arr[$rid-1]['num']) {
      $str='很抱歉,您所抽中的奖项已经中完!';
      $rid=0;
    }
    //生成一个用户抽奖的数据,用来记录到数据库
    $data=array(
      'rid'=>$rid,
      'pop'=>$str,
      'qq_no'=>$qq_no,
      'input_time'=>time()
    );
    //将用户抽奖信息数组写入数据库

    $Choujiang->add($data);
    unset($Choujiang);

     //ajax返回信息
    $this->ajaxReturn(1, $str);
  }

  /**
   * 根据概率获取中奖号码
   */
  private function get_rand($proArr) {
    $result = '';
    //概率数组的总概率精度
    $proSum = array_sum($proArr);
    //概率数组循环
    foreach ($proArr as $key => $proCur) {
      $randNum = mt_rand(1, $proSum);
      if ($randNum <= $proCur) {
        $result = $key;
        break;
      } else {
        $proSum -= $proCur;
      }
    }
    unset($proArr);
    return $result;
  }

}
?>

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

希望大家可以结合有关php抽奖程序的文章进行深入学习,更好的掌握这门语言的应用技巧。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php抽奖概率算法
, php中奖概率算法
, 抽奖概率算法
中奖概率算法
数据挖掘算法实例代码、递归算法经典实例、遗传算法实例、神经网络算法实例说明、神经网络算法实例,以便于您获取更多的相关知识。

时间: 2024-11-01 04:01:19

PHP抽奖算法程序代码分享_php实例的相关文章

php实现可以设置中奖概率的抽奖程序代码分享_php实例

复制代码 代码如下: <?php/** * 抽奖 * @param int $total */function getReward($total=1000){ $win1 = floor((0.12*$total)/100); $win2 = floor((3*$total)/100); $win3 = floor((12*$total)/100); $other = $total-$win1-$win2-$win3; $return = array(); for ($i=0;$i<$win1

php等比例缩放图片及剪切图片代码分享_php实例

php等比例缩放图片及剪切图片代码分享 /** * 图片缩放函数(可设置高度固定,宽度固定或者最大宽高,支持gif/jpg/png三种类型) * Author : Specs * * @param string $source_path 源图片 * @param int $target_width 目标宽度 * @param int $target_height 目标高度 * @param string $fixed_orig 锁定宽高(可选参数 width.height或者空值) * @ret

PHP Web木马扫描器代码分享_php实例

不废话了,直接贴代码了. 代码如下: <?php header('content-type:text/html;charset=gbk'); set_time_limit(0);//防止超时 /** * * php目录扫描监控增强版 * * @version 1.0 * 下面几个变量使用前需要手动设置 * **/ /*===================== 程序配置 =====================*/ $pass="test";//设置密码 $jkdir=&quo

php单链表实现代码分享_php实例

本文实例为大家分享了php单链表的具体代码,供大家参考,具体内容如下 <?php /** * 单链表 */ class Demo { private $id; public $name; public $next; public function __construct ($id = '', $name = '') { $this->id = $id; $this->name = $name; } static public function show ($head) { $cur =

使用PHPMailer实现邮件发送代码分享_php实例

发送邮件是常用的功能,LZ今天在项目中也碰到了,特此分享一下. 首先,去下载PHPMailer 1.https://github.com/dwqs/PHPMailer 2.http://download.csdn.net/detail/u011043843/8063583 下载之后,将文件解压到项目目录的对应位置,将class.phpmailer.php和class.smtp.php引入项目中,看代码:(解压的文件不要删除,否则不行) <?php // 必要导入 require("clas

PHP微信红包生成代码分享_php实例

本文实例为大家分享了PHP微信公众号自动发送红包API代码,分享给大家供大家参考.具体如下: 贴出核心接口代码至于数据自己填写,接口测试OKwechat_packet.php <!--?php /** * 发送红包接口 * Created by PhpStorm. * User: ADKi * Date: 2016/4/25 0025 * Time: 15:25 */ class wechat_packet{ private $url = 'https://api.mch.weixin.qq.c

thinkphp整合微信支付代码分享_php实例

本文实例为大家分享了thinkphp整合微信支付代码,供大家参考,具体内容如下 下载:支付SDK   将微信支付SDK放在第三方类库Vendor下面,请切记把WxPay.Config.php里面的商户信息修改为您的公众号信息,以避免造成资金的流失. php端代码 public function pay(){ //商户基本信息,可以写死在WxPay.Config.php里面,其他详细参考WxPayConfig.php vendor('Pay.JSAPI'); $tools = new \JsApi

PHP中数据库单例模式的实现代码分享_php实例

首先我们要知道明确单例模式这个概念,那么什么是单例模式呢? 单例模式顾名思义,就是只有一个实例. 作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类我们称之为单例类. 单例模式的要点有三个: 一是某个类只能有一个实例: 二是它必须自行创建这个实例: 三是它必须自行向整个系统提供这个实例. 下面我们讨论下为什么要使用PHP单例模式? 多数人都是从单例模式的字面上的意思来理解它的用途, 认为这是对系统资源的节省, 可以避免重复实例化, 是一种"计划

PHP实现的多彩标签效果代码分享_php实例

目前,大家的博客左侧通常加上一个漂亮的多彩标记,也想给自己的小站加一下这个小功能. 可惜已经再不再是使用WordPress的时候那么方便了,使用WordPress的朋友们直接使用现成的插件,鼠标点点就可以加上这个炫彩的功能.小站程序是自个写的,要加这么一个功能还是得自己动手,就当学习吧! 首先,我分析了一下目前多彩标签的主要表现形式,主要有两点:颜色多样,大小不一.这个是多彩标签的特性,于是想到了PHP中的随机函数rand.直接给大小,颜色用rand随机取值就可以. 大小的随机值容易搞定,直接生