<?php
header('Content-type:text/html;charset=utf-8');
/** * 抽奖工具 */ 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();
}
} $awards = array(
'0' => array('pro' => 1, 'info' => '1%的可能性' , 'num' =>0),
'1' => array('pro' => 25, 'info' => '25%的可能性' , 'num' =>0),
'2' => array('pro' => 40, 'info' => '40%的可能性' , 'num' =>0),
'3' => array('pro' => 34, 'info' => '34%的可能性' , 'num' =>0),
);
//改变概率字段名
lottery_tool::setProField('pro');
//设置奖品
lottery_tool::setAwards($awards);
$result = array(); for ($i = 100; $i --;) {
//抽奖
$result[] = lottery_tool::roll();
} foreach ($result as $key => $value) {
$awards[$value['roll_key']]['num'] ++;
} echo '<pre>';
var_dump($awards);

php随机抽奖实例分析的更多相关文章

  1. C#保留2位小数几种场景总结 游标遍历所有数据库循环执行修改数据库的sql命令 原生js轮盘抽奖实例分析(幸运大转盘抽奖) javascript中的typeof和类型判断

    C#保留2位小数几种场景总结   场景1: C#保留2位小数,.ToString("f2")确实可以,但是如果这个数字本来就小数点后面三位比如1.253,那么转化之后就会变成1.2 ...

  2. php按照奖品百分比随机抽奖代码分析

    这个忘记从哪里copy过来了 /** * 概率算法 * @param array $probability * @return integer|string */ function get_rand( ...

  3. 原生js轮盘抽奖实例分析(幸运大转盘抽奖)

    效果图: 所需图片素材: 这张图是pointer.png的位置的. turntable-bg.jpg这张是转盘背景图,在背景位置. 这张是turntable.png位置的. 需要这三张图片,如果要实现 ...

  4. RPC原理及RPC实例分析

    在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 1 2 3 4 5 6 public class ...

  5. 【Matplotlib】数据可视化实例分析

    数据可视化实例分析 作者:白宁超 2017年7月19日09:09:07 摘要:数据可视化主要旨在借助于图形化手段,清晰有效地传达与沟通信息.但是,这并不就意味着数据可视化就一定因为要实现其功能用途而令 ...

  6. Hive(六)hive执行过程实例分析与hive优化策略

    一.Hive 执行过程实例分析 1.join 对于 join 操作:SELECT pv.pageid, u.age FROM page_view pv JOIN user u ON (pv.useri ...

  7. RPC-原理及RPC实例分析

    还有就是:RPC支持的BIO,NIO的理解 (1)BIO: Blocking IO;同步阻塞: (2)NIO:Non-Blocking IO, 同步非阻塞; 参考:IO多路复用,同步,异步,阻塞和非阻 ...

  8. PHP+jQuery开发简单的翻牌抽奖实例

    PHP+jQuery开发简单的翻牌抽奖实例,实现流程:页面放置6个方块作为奖项,当抽奖者点击某一块时,方块翻转到背面,显示中奖信息,这个奖品是随机的,不是固定的. 在页面上放置6个奖项: <ul ...

  9. 数据结构:用实例分析ArrayList与LinkedList的读写性能

    目录 背景 ArrayList LinkedList 实例分析 1.增加数据 2.插入数据 3.遍历数据 3.1.LinkedList遍历改进 总结 背景 ArrayList与LinkedList是J ...

随机推荐

  1. Delphi GDI或图像处理的博客

    http://blog.csdn.net/w1028489713/article/category/1918251

  2. 关于windows service不能访问网络共享盘(NetWork Drive)的解决方案

    我映射一个网络驱动器到本机的时候,发现本机的程序直接能访问读取网络驱动器,但是把本机的程序作为本机的windows服务运行的时候就不能访问了. Qt中的QDir::exist(folder)访问失败. ...

  3. 创建组合索引SQL从1个多小时到1S的案例

    select aa.acct_org, aa.loan_acct_no, aa.FUNCTIONARY, aa.cust_no, sum(dwm.pkg_tools.currcdtran(bb.INT ...

  4. POJ3026 Borg Maze(最小生成树)

    题目链接. 题目大意: 任意两点(点表示字母)可以连线,求使所有点连通,且权值和最小. 分析: 第一感觉使3维的BFS.但写着写着,发现不对. 应当用最小生成树解法.把每个字母(即A,或S)看成一个结 ...

  5. nice命令

    Linux nice命令 Linux nice命令以更改过的优先序来执行程序,如果未指定程序,则会印出目前的排程优先序,内定的 adjustment 为 10,范围为 -20(最高优先序)到 19(最 ...

  6. POJ Stockbroker Grapevine 1125 多源最短路(Floyd)

    题目大意: 股票经纪人要散播股票的谣言,每个人都有人际关系,每个人只信任他相信的人传播的谣言, 其实也就是有向图.问 哪个人能最快的将谣言传播给所有人,并且求出传过去的最短时间. 题目分析: 我们用F ...

  7. python自动化测试遇到的零零碎碎

    1.需求: 提取xx.py中所有的函数名,形成一个类似于索引的参考. 解决方式: grep "def" *.py| awk '{print $2}'|awk -F ':' '{pr ...

  8. C++ —— 非常量引用不能指向临时对象

    目录 举例 分析 解决 1.举例 非常量引用 指向 临时对象 —— 即:将 临时对象 传递给 非常量引用类型. 如以下情况就会出现: 实现实数Rational类,实数可以使用+号相加,运算的结果要可以 ...

  9. JavaScript实现自定义短信模板

    自定义短信模板,要求:可以插入关键字,当然是可以在点击到文本域中的任意位置,关键字以中括号包裹的形式出现[关键字],删除关键字要整个关键都删掉,而不是自己全删除. 详细在简书中 http://www. ...

  10. Android中如何将dp,dip,sp与px相互转化

    Android中有很多度量单位:比如常用的dp,dip,sp,px等,有时候需要将他们相互转换,有下面非常方便的方法: 比如sp转换成px: TypedValue.applyDimension(Typ ...