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 在线打包_支持子目录
Jun 28 PHP
php 将bmp图片转为jpg等其他任意格式的图片
Jun 21 PHP
备份mysql数据库的php代码(一个表一个文件)
May 28 PHP
php读取文件内容的几种方法详解
Jun 26 PHP
php中操作memcached缓存进行增删改查数据的实现代码
Aug 15 PHP
PHP中auto_prepend_file与auto_append_file用法实例分析
Sep 22 PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
Apr 03 PHP
php实现给一张图片加上水印效果
Jan 02 PHP
Thinkphp单字母函数使用指南
May 08 PHP
Yii隐藏URL中index.php的方法
Jul 12 PHP
分享PHP-pcntl 实现多进程代码
Sep 30 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
Aug 30 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.ini中添加extension=php_mysqli.dll指令的说明
2007/06/14 PHP
解析PHP汉字转换拼音的类
2013/06/18 PHP
PHP分页初探 一个最简单的PHP分页代码的简单实现
2016/06/21 PHP
PHPExcel在linux环境下导出报500错误的解决方法
2017/01/26 PHP
PHP基于openssl实现非对称加密代码实例
2020/06/19 PHP
表单项的name命名为submit、reset引起的问题
2007/12/22 Javascript
jquery中get和post的简单实例
2014/02/04 Javascript
理解javascript中DOM事件
2015/12/25 Javascript
关于js函数解释(包括内嵌,对象等)
2016/11/20 Javascript
ES6 javascript中class类的get与set用法实例分析
2017/10/30 Javascript
create-react-app修改为多页面支持的方法
2018/05/17 Javascript
Node.js如何对SQLite的async/await封装详解
2019/02/14 Javascript
详解vue父子组件关于模态框状态的绑定方案
2019/06/05 Javascript
[56:14]Fnatic vs OG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
matplotlib绘制符合论文要求的图片实例(必看篇)
2017/06/02 Python
pandas修改DataFrame列名的实现方法
2019/02/22 Python
python中property和setter装饰器用法
2019/12/19 Python
Python简单实现区域生长方式
2020/01/16 Python
使用Python爬虫库requests发送表单数据和JSON数据
2020/01/25 Python
Python爬虫爬取、解析数据操作示例
2020/03/27 Python
Python进程的通信Queue、Pipe实例分析
2020/03/30 Python
Python Opencv中用compareHist函数进行直方图比较对比图片
2020/04/07 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
2020/05/22 Python
使用HTML5的Notification API制作web通知的教程
2015/05/08 HTML / CSS
TripAdvisor西班牙官方网站:全球领先的旅游网站
2018/01/10 全球购物
StringBuilder和String的区别
2015/05/18 面试题
会计专业自荐信范文
2013/12/02 职场文书
电脑租赁公司创业计划书
2014/01/08 职场文书
市场营销专业毕业生求职信
2014/03/26 职场文书
员工安全生产承诺书
2014/05/22 职场文书
护理专科学生自荐书
2014/07/05 职场文书
幼儿园家长安全责任书
2014/07/22 职场文书
体育活动总结
2015/02/04 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书
鸦片战争观后感
2015/06/09 职场文书
Windows Server 2012 R2服务器安装与配置的完整步骤
2022/07/15 Servers