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 相关文章推荐
FCKeditor的安装(PHP)
Jan 13 PHP
php at(@)符号的用法简介
Jul 11 PHP
set_include_path和get_include_path使用及注意事项
Feb 02 PHP
PHP中array_merge和array相加的区别分析
Jun 17 PHP
php常见的魔术方法详解
Dec 25 PHP
Zend Framework创建自己的动作助手详解
Mar 05 PHP
PHP标准类(stdclass)用法示例
Sep 28 PHP
iis6手工创建网站后无法运行php脚本的解决方法
Jun 08 PHP
使用 laravel sms 构建短信验证码发送校验功能
Nov 06 PHP
PHP实现动态创建XML文档的方法
Mar 30 PHP
php实现分页功能的详细实例方法
Sep 29 PHP
基于PHP实现堆排序原理及实例详解
Jun 19 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编程实现获取excel文档内容的代码实例
2011/06/28 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
2019/05/13 PHP
Jquery iframe内部出滚动条
2010/02/11 Javascript
JavaScript Chart 插件整理
2010/06/18 Javascript
DOM 中的事件处理介绍
2012/01/18 Javascript
jQuery在html有效在jsp无效的原因及解决方法
2013/08/02 Javascript
jQuery让控件左右移动的三种实现方法
2013/09/08 Javascript
javascript放大镜效果的简单实现
2013/12/09 Javascript
深入理解JavaScript系列(42):设计模式之原型模式详解
2015/03/04 Javascript
原创jQuery弹出层插件分享
2015/04/02 Javascript
Angularjs中使用layDate日期控件示例
2017/01/11 Javascript
angularjs路由传值$routeParams详解
2020/09/05 Javascript
使用JavaScript实现一个小程序之99乘法表
2017/09/21 Javascript
十分钟带你快速了解React16新特性
2017/11/10 Javascript
JS 仿支付宝input文本输入框放大组件的实例
2017/11/14 Javascript
从setTimeout看js函数执行过程
2017/12/19 Javascript
基于ionic实现下拉刷新功能
2018/05/10 Javascript
vue中更改数组中属性,在页面中不生效的解决方法
2019/10/30 Javascript
JS实现长图上下滚动效果
2020/03/19 Javascript
ptyhon实现sitemap生成示例
2014/03/30 Python
基于Python列表解析(列表推导式)
2018/06/23 Python
在Python中如何传递任意数量的实参的示例代码
2019/03/21 Python
Python3.5内置模块之random模块用法实例分析
2019/04/26 Python
Python获取时间戳代码实例
2019/09/24 Python
python logging设置level失败的解决方法
2020/02/19 Python
Python基于pip实现离线打包过程详解
2020/05/15 Python
sklearn和keras的数据切分与交叉验证的实例详解
2020/06/19 Python
Html5 postMessage实现跨域消息传递
2016/03/11 HTML / CSS
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
银行优秀员工事迹
2014/02/06 职场文书
论文诚信承诺书
2014/05/23 职场文书
汽车服务工程专业自荐信
2014/09/02 职场文书
2014年医务科工作总结
2014/12/18 职场文书
催款通知书范文
2015/04/17 职场文书
SpringBoot工程下使用OpenFeign的坑及解决
2021/07/02 Java/Android