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之第一天
Oct 09 PHP
解析coreseek for sphinx的使用
Jun 21 PHP
PHP将XML转数组过程详解
Nov 13 PHP
PHP实现根据图片色界在不同位置加水印的方法
Aug 08 PHP
WordPress中获取所使用的模板的页面ID的简单方法
Dec 31 PHP
网页的分页下标生成代码(PHP后端方法)
Feb 03 PHP
php微信公众号开发(4)php实现自定义关键字回复
Dec 15 PHP
PHP中递归的实现实例详解
Nov 14 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
May 28 PHP
php app支付宝回调(异步通知)详解
Jul 25 PHP
PHP利用Mysql锁解决高并发的方法
Sep 04 PHP
PHP封装的mysqli数据库操作类示例
Feb 16 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
Ajax PHP简单入门教程代码
2008/04/25 PHP
PHP 5.3.0 安装分析心得
2009/08/07 PHP
微信企业转账之入口类分装php代码
2018/10/01 PHP
$.each遍历对象、数组的属性值并进行处理
2014/07/18 Javascript
javascript手风琴下拉菜单实现代码
2015/11/12 Javascript
JavaScript进阶练习及简单实例分析
2016/06/03 Javascript
Angular2 PrimeNG分页模块学习
2017/01/14 Javascript
JS实现中国公民身份证号码有效性验证
2017/02/20 Javascript
xmlplus组件设计系列之网格(DataGrid)(10)
2017/05/05 Javascript
详解vuejs几种不同组件(页面)间传值的方式
2017/06/01 Javascript
详解微信第三方小程序代开发
2017/06/23 Javascript
vue2.0全局组件之pdf详解
2017/06/26 Javascript
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
2017/09/12 Javascript
常用的 JS 排序算法 整理版
2018/04/05 Javascript
微信小程序获取音频时长与实时获取播放进度问题
2018/08/28 Javascript
vue动态绑定class选中当前列表变色的方法示例
2018/12/19 Javascript
vue 解决移动端弹出键盘导致页面fixed布局错乱的问题
2019/11/06 Javascript
基于node+vue实现简单的WebSocket聊天功能
2020/02/01 Javascript
浅谈JSON5解决了JSON的两大痛点
2020/12/14 Javascript
JS中多层次排序算法的实现代码
2021/01/06 Javascript
[01:08:48]LGD vs OG 2018国际邀请赛淘汰赛BO3 第三场 8.25
2018/08/29 DOTA
python生成指定尺寸缩略图的示例
2014/05/07 Python
Python Web框架Tornado运行和部署
2020/10/19 Python
python3下实现搜狗AI API的代码示例
2018/04/10 Python
对pandas进行数据预处理的实例讲解
2018/04/20 Python
PyQt5 在label显示的图片中绘制矩形的方法
2019/06/17 Python
Python函数参数类型及排序原理总结
2019/12/19 Python
python实现单张图像拼接与批量图片拼接
2020/03/23 Python
俄语翻译实习生的自我评价分享
2013/11/06 职场文书
汽车运用工程专业求职信
2014/06/18 职场文书
大三学生学年自我鉴定
2014/09/12 职场文书
幼儿园迎国庆65周年活动策划方案
2014/09/16 职场文书
个人买房协议书范本
2014/10/06 职场文书
2014年作风建设心得体会
2014/10/22 职场文书
2014年个人教学工作总结
2014/12/09 职场文书
Oracle11g R2 安装教程完整版
2021/06/04 Oracle