php实现自定义中奖项数和概率的抽奖函数示例


Posted in PHP onMay 26, 2017

本文实例讲述了php实现自定义中奖项数和概率的抽奖函数。分享给大家供大家参考,具体如下:

<?php
/*
* 一个抽奖类,精确到万分之一
* 三个步骤:1.接受一个中奖概率数组;2.接受一个抽奖种子;3.返回中奖等级
*/
class Lottery {
/*
* 中奖概率数组,自动判断奖项数目
* 数组键值和为100,自动计算出不中奖的概率,若初始是超过100抛出一个错误
*/
protected $_rate = array();
/*
* 设置中奖概率,
* @param Array,中奖概率,以数组形式传入
*/
public function setRate($rate = array(12.1, 34)) {
$this->_rate = $rate;
if (array_sum($this->_rate) > 100)//检测概率设置是否有问题
throw new Exception('Winning rate upto 100%');
if (array_sum($this->_rate) < 100)
//定义未中奖情况的概率,用户给的概率只和为100时,则忽略0
$this->_rate[] = 100 - array_sum($this->_rate);
}
/*
* 随机生成一个1-10000的整数种子,提交给中奖判断函数
* @return int,按传入的概率排序,返回中奖的项数
*/
public function runOnce() {
return $this->judge(mt_rand(0, 10000));
}
/*
* 按所设置的概率,判断一个传入的随机值是否中奖
* @param int,$seed 10000以内的随机数
* @return int,$i 按传入的概率排序,返回中奖的项数
*/
protected function judge($seed) {
foreach ($this->_rate as $key => $value) {
$tmpArr[$key + 1] = $value * 100;
}
//将概率乘十后累计,以便随机选择,组合成
$tmpArr[0] = 0;
foreach ($tmpArr as $key => $value) {
if ($key > 0) {
$tmpArr[$key] += $tmpArr[$key - 1];
}
}
for ($i = 1; $i < count($tmpArr); $i++) {
if ($tmpArr[$i - 1] < $seed && $seed <= $tmpArr[$i]) {
return $i; //返回中奖的项数(按概率的设置顺序)
}
}
}
}
$rate = array(33, 20, 2, 0.95, 12, 4.55);
$a = new Lottery;
$a->setRate($rate);
for ($i = 0; $i <= 10000; $i++) {
$b = $a->runOnce();
@$rewards[$b]++;
}
unset($rewards['']);
echo array_sum($rewards);
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf8" />
</head>
<body>
<table>
<thead>运行10000次,对比设置概率和中奖次数</thead>
<tr><th>设置概率</th><th>中奖次数</th></tr>
<tr><td><?php echo $rate[0]; ?>%</td><td><?php echo $rewards[1] ?></td></tr>
<tr><td><?php echo $rate[1]; ?>%</td><td><?php echo $rewards[2] ?></td></tr>
<tr><td><?php echo $rate[2]; ?>%</td><td><?php echo $rewards[3] ?></td></tr>
<tr><td><?php echo $rate[3]; ?>%</td><td><?php echo $rewards[4] ?></td></tr>
<tr><td><?php echo $rate[4]; ?>%</td><td><?php echo $rewards[5] ?></td></tr>
<tr><td><?php echo $rate[5]; ?>%</td><td><?php echo $rewards[6] ?></td></tr>
<tr><td><?php echo 'miss'; ?></td><td><?php echo $rewards[7] ?></td></tr>
</table>
</body>
</html>
PHP 相关文章推荐
建立动态的WML站点(三)
Oct 09 PHP
实例(Smarty+FCKeditor新闻系统)
Jan 02 PHP
PHP批量生成缩略图的代码
Jul 19 PHP
PHP 多进程 解决难题
Jun 22 PHP
php后门URL的防范
Nov 12 PHP
支持中文的PHP按字符串长度分割成数组代码
May 17 PHP
php获取json数据所有的节点路径
May 17 PHP
深入浅析php json 格式控制
Dec 24 PHP
Yii2 GridView实现列表页直接修改数据的方法
May 16 PHP
详解php中空字符串和0之间的关系
Oct 23 PHP
PHP登录(ajax提交数据和后台校验)实例分享
Dec 29 PHP
PHP+Mysql分布式事务与解决方案深入理解
Feb 27 PHP
PHP判断密码强度的方法详解
May 26 #PHP
thinkphp实现附件上传功能
May 26 #PHP
微信第三方登录(原生)demo【必看篇】
May 26 #PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
May 26 #PHP
老生常谈PHP面向对象之注册表模式
May 26 #PHP
老生常谈PHP数组函数array_merge(必看篇)
May 25 #PHP
Yii框架实现多数据库配置和操作的方法
May 25 #PHP
You might like
php代码审计比较有意思的例子
2014/05/07 PHP
thinkphp模板输出技巧汇总
2014/11/24 PHP
php使用CURL伪造IP和来源实例详解
2015/01/15 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
2018/12/07 PHP
判断多个input type=file是否有已经选择好文件的代码
2012/05/23 Javascript
js读写json文件实例代码
2014/10/21 Javascript
javascript实现画不相交的圆
2015/04/07 Javascript
javascript将中国数字格式转换成欧式数字格式的简单实例
2016/08/02 Javascript
JS 验证密码 不能为空,必须含有数字、字母、特殊字符,长度在8-12位
2017/06/21 Javascript
ES6新增的math,Number方法
2017/08/06 Javascript
vue中axios解决跨域问题和拦截器的使用方法
2018/03/07 Javascript
最适应的vue.js的form提交涉及多种插件【推荐】
2018/08/27 Javascript
js限制输入框只能输入数字(onkeyup触发)
2018/09/28 Javascript
一些可能会用到的Node.js面试题
2019/06/15 Javascript
[02:12]打造更好的电竞完美世界:完美盛典回顾篇
2018/12/19 DOTA
python从ftp下载数据保存实例
2013/11/20 Python
python实现根据ip地址反向查找主机名称的方法
2015/04/29 Python
深入解析Python中的变量和赋值运算符
2015/10/12 Python
Python3使用requests包抓取并保存网页源码的方法
2016/03/15 Python
Python使用ntplib库同步校准当地时间的方法
2016/07/02 Python
详解使用 pyenv 管理多个版本 python 环境
2017/10/19 Python
python中实现将多个print输出合成一个数组
2018/04/19 Python
如何用python整理附件
2018/05/13 Python
pycharm远程开发项目的实现步骤
2019/01/20 Python
在pycharm中为项目导入anacodna环境的操作方法
2020/02/12 Python
浅谈Python里面None True False之间的区别
2020/07/09 Python
Python 如何展开嵌套的序列
2020/08/01 Python
python Protobuf定义消息类型知识点讲解
2021/03/02 Python
菲律宾旅游网站:Expedia菲律宾
2017/10/11 全球购物
北京RT科技有限公司.net工程师面试题
2013/02/15 面试题
儿科护士实习自我鉴定
2013/10/17 职场文书
股东协议书
2014/04/14 职场文书
感恩节活动策划方案
2014/05/16 职场文书
2014年大学教师工作总结
2014/12/02 职场文书
优秀党支部申报材料
2014/12/24 职场文书
2016年安全生产先进个人事迹材料
2016/02/29 职场文书