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中动态HTML的输出技术
Oct 09 PHP
使用php4加速网络传输
Oct 09 PHP
PHP写的获取各搜索蜘蛛爬行记录代码
Aug 21 PHP
一组PHP可逆加密解密算法实例代码
Jan 21 PHP
PHP不用递归实现无限分级的例子分享
Apr 18 PHP
IIS下PHP的三种配置方式对比
Nov 20 PHP
php正则匹配html中带class的div并选取其中内容的方法
Jan 13 PHP
PHP实现指定字段的多维数组排序函数分享
Mar 09 PHP
php获取微信共享收货地址的方法
Dec 21 PHP
PHP+MySQL实现输入页码跳转到指定页面功能示例
Jun 01 PHP
PHP中Static(静态)关键字功能与用法实例分析
Apr 05 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 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中的类-什么叫类
2006/11/20 PHP
php实现的CSS更新类实例
2014/09/22 PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
2015/03/25 PHP
php调整服务器时间的方法
2015/04/03 PHP
PHP命令行执行整合pathinfo模拟定时任务实例
2016/08/12 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
Laravel如何自定义command命令浅析
2019/03/23 PHP
js TextArea的选中区域处理
2010/12/28 Javascript
使用jQuery将多条数据插入模态框的实现代码
2014/10/08 Javascript
jQuery使用之标记元素属性用法实例
2015/01/19 Javascript
JavaScript希尔排序、快速排序、归并排序算法
2016/05/08 Javascript
当jquery ajax遇上401请求的解决方法
2016/05/19 Javascript
详解webpack-dev-server使用http-proxy解决跨域问题
2018/01/13 Javascript
Vue使用watch监听一个对象中的属性的实现方法
2019/05/10 Javascript
一文搞懂ES6中的Map和Set
2019/05/20 Javascript
详解vue组件之间的通信
2020/08/30 Javascript
原生js+css实现tab切换功能
2020/09/17 Javascript
ant design中upload组件上传大文件,显示进度条进度的实例
2020/10/29 Javascript
[03:00]DOTA2-DPC中国联赛1月18日Recap集锦
2021/03/11 DOTA
python 列表,数组,矩阵两两转换tolist()的实例
2018/04/04 Python
Pytorch入门之mnist分类实例
2018/04/14 Python
python 把文件中的每一行以数组的元素放入数组中的方法
2018/04/29 Python
python K近邻算法的kd树实现
2018/09/06 Python
Python 实现域名解析为ip的方法
2019/02/14 Python
全面了解django的缓存机制及使用方法
2019/07/22 Python
python实现遍历文件夹图片并重命名
2020/03/23 Python
HTML5给汉字加拼音收起展开组件的实现代码
2020/04/08 HTML / CSS
Sneaker Studio捷克:购买运动鞋
2018/07/08 全球购物
施华洛世奇巴西官网:SWAROVSKI巴西
2019/12/03 全球购物
爱岗敬业演讲稿范文
2014/01/14 职场文书
工程建设实施方案
2014/03/14 职场文书
教师党员承诺书2015
2015/01/21 职场文书
2015年中秋寄语
2015/07/31 职场文书
防震减灾主题班会
2015/08/14 职场文书
合同范本之电脑出租
2019/08/13 职场文书
Python绘制地图神器folium的新人入门指南
2021/05/23 Python