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 相关文章推荐
php木马webshell扫描器代码
Jan 25 PHP
php 多关键字 高亮显示实现代码
Apr 23 PHP
解析php DOMElement 操作xml 文档的实现代码
May 10 PHP
php教程之phpize使用方法
Feb 12 PHP
zf框架的Filter过滤器使用示例
Mar 13 PHP
easyui的tabs update正确用法分享
Mar 21 PHP
php url路由入门实例
Apr 23 PHP
解决ThinkPHP下使用上传插件Uploadify浏览器firefox报302错误的方法
Dec 18 PHP
php抽奖概率算法(刮刮卡,大转盘)
Apr 17 PHP
js基于qrcode.js生成二维码的方法【附demo插件源码下载】
Dec 28 PHP
php简单读取.vcf格式文件的方法示例
Sep 02 PHP
PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
May 31 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
rrmdir php中递归删除目录及目录下的文件
2011/05/15 PHP
PHP7.0版本备注
2015/07/23 PHP
php获取当前页面完整URL地址
2015/12/30 PHP
php表单处理操作
2017/11/16 PHP
PHP+Apache实现二级域名之间共享cookie的方法
2019/07/24 PHP
PHP封装请求类实例分析【基于Yii框架】
2019/10/17 PHP
Javascript Object.extend
2010/05/18 Javascript
juqery 学习之四 筛选过滤
2010/11/30 Javascript
jquer之ajaxQueue简单实现代码
2011/09/15 Javascript
JavaScript中变量声明有var和没var的区别示例介绍
2014/09/15 Javascript
javascript的函数作用域
2014/11/12 Javascript
JavaScript制作windows经典扫雷小游戏
2015/03/31 Javascript
轻松搞定js表单验证
2016/10/13 Javascript
Nodejs中使用phantom将html转为pdf或图片格式的方法
2017/09/18 NodeJs
详解从买域名到使用pm2部署node.js项目全过程
2018/03/07 Javascript
vue富文本框(插入文本、图片、视频)的使用及问题小结
2018/08/17 Javascript
javascript for循环性能测试示例
2019/08/07 Javascript
React路由鉴权的实现方法
2019/09/05 Javascript
python调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件
2014/08/15 Python
Python中subprocess模块用法实例详解
2015/05/20 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
2019/01/19 Python
python判断文件是否存在,不存在就创建一个的实例
2019/02/18 Python
python实现翻转棋游戏(othello)
2019/07/29 Python
pycharm编写spark程序,导入pyspark包的3中实现方法
2019/08/02 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
2019/08/21 Python
python requests抓取one推送文字和图片代码实例
2019/11/04 Python
Python的历史与优缺点整理
2020/05/26 Python
Python3爬虫关于识别检验滑动验证码的实例
2020/07/30 Python
Prototype如何为一个Ajax添加一个参数
2015/12/06 面试题
马云的职业生涯规划之路
2014/01/01 职场文书
诚信的演讲稿范文
2014/05/12 职场文书
药店采购员岗位职责
2014/09/30 职场文书
小学生五一劳动节演讲稿
2015/03/18 职场文书
小学教师岗位职责
2015/04/02 职场文书
2015年初三班主任工作总结
2015/05/21 职场文书
毕业酒会致辞
2015/07/29 职场文书