php随机抽奖实例分析


Posted in PHP onMarch 04, 2015

本文实例讲述了php随机抽奖用法。分享给大家供大家参考。具体分析如下:

1. 按照设定的概率,得到随机抽奖的结果。    

<?php 

/**

 * 抽奖工具

 */

class lottery_tool {

    protected static $awardsArr;

    protected static $proField = 'probability';

    protected static $proSum = 0;

    protected static $checkAward = false;

    const SUCCESS_CODE = 0;

    const FAIL_CODE = -1;

    //检查抽奖数据

    protected static function checkAwards(){

        if (!is_array(self::$awardsArr) || empty(self::$awardsArr)) {

            return self::$checkAward = false;

        }

        self::$proSum = 0;

        foreach (self::$awardsArr as $_key => $award) {

            self::$proSum += $award[self::$proField];

        }

        if (empty(self::$proSum)) {

            return self::$checkAward = false;

        }

        return self::$checkAward = true;

    }

    protected static function successRoll($rollKey){

        return array('code' => self::SUCCESS_CODE, 'roll_key' => $rollKey, 'msg' => 'roll success');

    }

    protected static function failRoll($msg = 'roll fail'){

        return array('code' => self::FAIL_CODE, 'msg' => $msg );

    }

    //抽奖

    public static function roll () {

        if (false == self::$checkAward) {

            return self::failRoll('awards data is not the right format!');

        }

        $result = mt_rand(0, self::$proSum);

        $proValue = 0;

        foreach (self::$awardsArr as $_key => $value) {

            $proValue += $value[self::$proField]; 

            if ($result <= $proValue) {

                return self::successRoll($_key);

            }

        }

        return self::failRoll('wrong');

    } 

    //改变概率字段名

    public static function setProField($field = null) {

        if (!empty($field)) {

            self::$proField = $field;

        }

    }

    //设置奖品

    public static function setAwards($awards){

        self::$awardsArr = $awards;

        self::checkAwards();

    }

}

2. 示例代码:
$awards = array(

    '0' => array('pro' => 15, 'info' => '15%的可能性'),

    '1' => array('pro' => 25, 'info' => '25%的可能性'),

    '2' => array('pro' => 40, 'info' => '40%的可能性'),

    '3' => array('pro' => 20, 'info' => '20%的可能性'),

    );

lottery_tool::setProField('pro');

lottery_tool::setAwards($awards);

$result = array();

for ($i = 10000; $i --;) {

    $result[] = lottery_tool::roll();

}

foreach ($result as $key => $value) {

    $awards[$value['roll_key']]['num'] ++;

}

echo '<pre>';

var_dump($awards);

运行结果如下:

array

  0 => 

    array

      'pro' => int 15

      'info' => string '15%的可能性' (length=15)

      'num' => int 1596

  1 => 

    array

      'pro' => int 25

      'info' => string '25%的可能性' (length=15)

      'num' => int 2484

  2 => 

    array

      'pro' => int 40

      'info' => string '40%的可能性' (length=15)

      'num' => int 3939

  3 => 

    array

      'pro' => int 20

      'info' => string '20%的可能性' (length=15)

      'num' => int 1981

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
php生成WAP页面
Oct 09 PHP
php指定函数参数默认值示例代码
Dec 04 PHP
解决CodeIgniter伪静态失效
Jun 09 PHP
php获取URL中带#号等特殊符号参数的解决方法
Sep 02 PHP
php操作MongoDB类实例
Jun 17 PHP
PHP图像裁剪缩略裁切类源码及使用方法
Jan 07 PHP
PHP实现的方程求解示例分析
Nov 11 PHP
深入解析PHP中SESSION反序列化机制
Mar 01 PHP
PHP实现负载均衡session共享redis缓存操作示例
Aug 22 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
May 14 PHP
TP5(thinkPHP5框架)基于bootstrap实现的单图上传插件用法示例
May 29 PHP
PHP常用header头定义代码示例汇总
Aug 29 PHP
php二维数组合并及去重复的方法
Mar 04 #PHP
php中get_cfg_var()和ini_get()的用法及区别
Mar 04 #PHP
php用ini_get获取php.ini里变量值的方法
Mar 04 #PHP
浅谈PHP中单引号和双引号到底有啥区别呢?
Mar 04 #PHP
php查询mysql大量数据造成内存不足的解决方法
Mar 04 #PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
Mar 03 #PHP
PHP获取POST数据的几种方法汇总
Mar 03 #PHP
You might like
PHP对象转换为数组函数(递归方法)
2012/02/04 PHP
浅析PHP substr,mb_substr以及mb_strcut的区别和用法
2013/06/21 PHP
php中如何判断一个网页请求是ajax请求还是普通请求
2013/08/10 PHP
PHP中Closure类的使用方法及详解
2015/10/09 PHP
浅析Yii2 gridview实现批量删除教程
2016/04/22 PHP
JavaScript去掉数组中的重复元素
2011/01/13 Javascript
SharePoint 客户端对象模型 (一) ECMA Script
2011/05/22 Javascript
jQuery获取动态生成的元素示例
2014/06/15 Javascript
JavaScript生成随机字符串的方法
2015/03/19 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
2015/05/14 Javascript
jQuery插件实现适用于移动端的地址选择器
2016/02/18 Javascript
通过Ajax使用FormData对象无刷新上传文件方法
2016/12/08 Javascript
JS限制条件补全问题实例分析
2016/12/16 Javascript
小程序实现新用户判断并跳转激活的方法
2019/05/20 Javascript
jQuery实现图片随机切换、抽奖功能(实例代码)
2019/10/23 jQuery
全面解析JavaScript Module模式
2020/07/24 Javascript
[01:00:30]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第二场 10.31
2020/11/02 DOTA
[58:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第一场 1月31日
2021/03/11 DOTA
python文件和目录操作方法大全(含实例)
2014/03/12 Python
Python中的迭代器漫谈
2015/02/03 Python
Python正则表达式分组概念与用法详解
2017/06/24 Python
详解Python list 与 NumPy.ndarry 切片之间的对比
2017/07/24 Python
Python设计模式之观察者模式原理与用法详解
2019/01/16 Python
Python numpy中矩阵的基本用法汇总
2019/02/12 Python
Django上使用数据可视化利器Bokeh解析
2019/07/31 Python
python3实现的zip格式压缩文件夹操作示例
2019/08/17 Python
PyCharm2019安装教程及其使用(图文教程)
2019/09/29 Python
python selenium实现发送带附件的邮件代码实例
2019/12/10 Python
python argparse模块通过后台传递参数实例
2020/04/20 Python
简单掌握CSS3中resize属性的用法
2016/04/01 HTML / CSS
美国购车网站:TrueCar
2016/10/19 全球购物
应届生文秘专业个人自荐信格式
2013/09/21 职场文书
房地产项目建议书
2014/03/12 职场文书
酒店节能降耗方案
2014/05/08 职场文书
2014年采购员工作总结
2014/11/18 职场文书
北京英文导游词
2015/02/12 职场文书